SQL Anywhere では、クエリ実行に対して、クエリ間とクエリ内の 2 種類の並列処理がサポートされています。クエリ間並列処理とは、異なる要求を別個の CPU 上で同時に実行することです。各要求 (タスク) は単一のスレッド、単一のプロセッサで実行されます。
クエリ内並列処理とは、単一の要求を複数の CPU で同時処理することです。クエリが分割されて各部がマルチプロセッサのハードウェアで並列処理されます。これらの各部は交換アルゴリズムで処理されます (交換アルゴリズム (Exchange)を参照)。クエリ内並列処理では、同時に実行されるクエリ数が使用可能なプロセッサ数より少ないことが多い場合に、負荷が分散されます。並列処理の程度は、max_query_tasks オプションを設定して制御します (max_query_tasks オプション [データベース]を参照)。
オプティマイザは、並列処理の追加コスト (ローの追加コピー、作業量の調整のための追加コスト) を推定し、パフォーマンスの向上が期待できる場合のみ並列プランを選択します。
クエリ内並列処理は、priority オプションが background に設定されている接続には使用されません。priority オプション [データベース]を参照してください。
現在要求を処理しているサーバ・スレッド数 (ActiveReq サーバ・プロパティ) が、データベース・サーバの使用ライセンスがあるコンピュータの CPU コア数を最近超えた場合は、クエリ内並列処理は使用されません。正確な時間はサーバによって決められ、通常は数秒です。データベース・サーバ・プロパティを参照してください。
クエリで並列実行が利用されるかどうかは、次の要因によって決まります。
最適化時にシステムで使用可能なリソース (メモリ、キャッシュ内のデータなど)
コンピュータの論理プロセッサ数
データベースの格納に使用されるディスク・デバイス数、プロセッサとコンピュータの I/O アーキテクチャの速度に対する相対速度
要求に必要な特定の代数演算子。SQL Anywhere では、次の 5 つの代数演算子がサポートされています。これらの演算子は並列実行できます。
サポートされていない演算子を使用しているクエリでも並列実行できる場合がありますが、プランで、サポートされている演算子がサポートされていない演算子の下にある必要があります (dbisql の表示)。サポートされていない演算子のほとんどが上の方にあるクエリは、並列処理される確率が高くなります。たとえば、ソート演算子は並列処理できませんが、最も外側のブロックで ORDER BY を使用するクエリは、ソートをプランの一番上に置き、すべての並列演算子をその下に置くことで並列処理できます。これに対して、派生テーブルで TOP n と ORDER BY を使用するクエリは、ソートがプランの一番上にないので、並列処理が使用される確率が低くなります。
SQL Anywhere では、DB 領域がデフォルトで単一プラッタのディスク・サブシステムにあると想定されます。このような環境では、クエリの並列実行を行う効果があっても、オプティマイザの単一デバイス用の I/O コスト・モデルによって、テーブルのデータが完全にキャッシュ内に収まっていないかぎり、オプティマイザで並列テーブルまたはインデックス・スキャンを選択するのが困難になります。ただし、ALTER DATABASE CALIBRATE PARALLEL READ 文を使用して I/O サブシステムを調整することで、オプティマイザで並列実行の効果をより正確に計算できます。スピンドルが複数ある場合は、並列実行がある程度含まれる実行プランがオプティマイザで選択される可能性が高くなります。
クエリ内並列処理がアクセス・プランに使用される場合、各サブツリーの並列処理の結果をマージ (UNION) する交換演算子がプランに含まれます。交換演算子の下位のサブツリー数が、並列処理の程度です。各サブツリー、またはアクセス・プランのコンポーネントは、データベース・サーバのタスクです (-gn サーバ・オプションを参照)。データベース・サーバのカーネルでは、実行スレッド (ファイバ) が使用可能かどうかに応じて、個々の SQL 要求と同じようにこれらのタスクがスケジュールされます。このアーキテクチャでは、すべてのアクセス・プランの並列処理の大部分が自動的に調整されます。並列実行タスクの処理はサーバ・カーネルの許可に従ってスレッド (ファイバ) にスケジュールされ、プランのコンポーネントが均等に実行されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |