Skip to main content

並列クエリ処理の構成

並列クエリ・ヒントは、マルチプロセッサ・システムで実行されている場合にクエリの並列処理を実行するようシステムに指示します。これにより、特定のタイプのクエリのパフォーマンスを大幅に向上させることができます。SQL オプティマイザは、特定のクエリに並列処理の効果があるかどうかを確認し、該当する場合は並列処理を実行します。並列クエリのヒントを指定しても、すべてのクエリの並列処理が強制されるわけではなく、並列処理によって効果が得られると考えられるクエリのみが対象になります。システムがマルチプロセッサ・システムでない場合、このオプションに効果はありません。現在のシステム上のプロセッサ数を特定するには、%SYSTEM.Util.NumberOfCPUs()Opens in a new tab メソッドを使用します。

既定では、アダプティブ・モードで並列クエリ処理が制御されます。アダプティブ・モードを無効にしている場合は、以下の 2 つの方法で並列クエリ処理を指定できます。

  • 自動並列オプションを設定して、システム全体で適用します。

  • 個々のクエリの FROM 節で %PARALLEL キーワードを指定して、クエリ単位で適用します。

クエリの並列処理は、SELECT クエリに適用されます。INSERTUPDATEDELETE の各操作には適用されません。

$job や $tlevel などのプロセス固有の関数が関係するクエリでは並列処理を避けてください。また、$ROWID のようなプロセス固有の変数のクエリでも並列処理を避けるようにします。

システム全体のクエリの並列処理

アダプティブ・モードが無効でも、以下のオプションのいずれかを使用することで、システム規模の並列クエリ処理を有効にすることができます。

  • 管理ポータルから、[システム管理][構成][SQL およびオブジェクトの設定][SQL] の順に選択します。[単一プロセスでクエリを実行する] チェック・ボックスを確認または変更します。このチェック・ボックスには既定ではチェックが付いていません。つまり、並列処理は既定で有効になっています。

  • $SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを、SET status=$SYSTEM.SQL.Util.SetOption("AutoParallel",1,.oldval) のように呼び出します。既定値は 1 です (自動並列処理が有効)。現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。これにより、[%PARALLEL の自動ヒントの有効化] オプションが表示されます。

この構成設定を変更すると、すべてのネームスペースですべてのクエリ・キャッシュが削除されることに注意してください。

システム全体の並列クエリ処理の詳細は、"アダプティブ・モードの使用によるパフォーマンスの向上" の "システム規模の自動並列化" を参照してください。

特定のクエリの並列クエリ処理

オプションの %PARALLEL キーワードは、クエリの FROM 節で指定します。これは、InterSystems IRIS が複数のプロセッサを使用してクエリの並列処理を実行することを示しています (該当する場合)。これにより、1 つ以上の COUNTSUMAVGMAX、または MIN 集約関数または GROUP BY 節 (あるいはその両方) を使用するクエリや、他の多くのタイプのクエリで、パフォーマンスを大幅に向上させることができます。一般にこれらは、大量のデータを処理し、小規模な結果セットを返すクエリです。例えば、SELECT AVG(SaleAmt) FROM %PARALLEL User.AllSales GROUP BY Region は、並列処理を使用する可能性が高くなります。

集約関数、式、およびサブクエリのみを指定する "1 行" のクエリは、GROUP BY 節の有無にかかわらず並列処理を実行します。ただし、個々のフィールドと 1 つ以上の集約関数の両方を指定する "複数行" のクエリは、GROUP BY 節が含まれていないときには並列処理を実行しません。例えば、SELECT Name,AVG(Age) FROM %PARALLEL Sample.Person は並列処理を実行しませんが、SELECT Name,AVG(Age) FROM %PARALLEL Sample.Person GROUP BY Home_State は並列処理を実行します。

%PARALLEL を指定しているクエリが実行時モードでコンパイルされると、すべての定数は ODBC 形式であるものとして解釈されます。

%PARALLEL を指定すると、クエリによってはパフォーマンスが低下する可能性があります。複数の同時ユーザがいるシステム上で %PARALLEL を指定してクエリを実行すると、総合的なパフォーマンスが低下する可能性があります。

ビューのクエリを実行する際に、並列処理を実行できます。ただし、%PARALLEL キーワードを明示的に指定していても、%VID を指定するクエリに対して並列処理が実行されることはありません。

詳細は、"InterSystems SQL リファレンス" の "FROM" 節を参照してください。

サブクエリ内の %PARALLEL

%PARALLEL は、SELECT クエリとそのサブクエリで使用するためのものです。INSERT コマンド・サブクエリは %PARALLEL を使用できません。

%PARALLEL は、括弧で囲まれたクエリと相互に関連しているサブクエリに適用された場合は無視されます。以下はその例です。

SELECT name,age FROM Sample.Person AS p 
WHERE 30<(SELECT AVG(age) FROM %PARALLEL Sample.Employee WHERE Name = p.Name)

%PARALLEL は、複合述語を含むサブクエリ、または複合述語へと最適化する述語を含むサブクエリに適用された場合は無視されます。複合と見なされる述語には、FOR SOME および FOR SOME %ELEMENT 述語があります。

クエリの並列処理の無視

自動並列オプションが設定されているかどうかや、%PARALLEL キーワードが FROM 節に指定されているかどうかに関係なく、クエリによっては、並列処理ではなく線形処理が使用されることがあります。InterSystems IRIS では、他のクエリ最適化オプションが指定されていれば、それを適用した後でクエリに並列処理を使用するかどうかが決まります。InterSystems IRIS は、ユーザ指定のクエリ形式が並列処理を実行すると利点があるように思える場合でも、最適化された形式のクエリが並列処理に適していないと判断することがあります。InterSystems IRIS が並列処理のためにクエリを分配したか、またはどのようにそうしたかは、プラン表示を使用して確認できます。

以下の状況では、%PARALLEL を指定しても並列処理は実行されません。クエリは正常に実行されてエラーは発行されませんが、並列処理は実行されません。

  • TOP 節ORDER BY 節の両方を含むクエリ。この節の組み合わせでは、最初の行に移動する時間が最短になるように最適化されており、並列処理は使用されません。FROM 節の %NOTOPOPT optimize-option キーワードを追加することで、完全な結果セットの取得が最速になるように最適化されます。クエリに集約関数が含まれていない場合、この %PARALLEL と %NOTOPOPT の組み合わせにより、クエリの並列処理が実行されます。

  • ビューを参照し、ビュー ID (%VID) を返すクエリ。

  • %PARALLEL は、標準的なデータ・ストレージ定義を使用するテーブルで使用するためのものです。カスタマイズされたストレージ形式での使用はサポートされない場合があります。%PARALLEL は、GLOBAL TEMPORARY テーブル、または拡張グローバル参照ストレージがあるテーブルではサポートされません。

  • %PARALLEL は、テーブルのすべての行にアクセスできるクエリ用であり、行レベル・セキュリティ (ROWLEVELSECURITYOpens in a new tab) が定義されているテーブルは並列処理を実行できません。

  • %PARALLEL は、ローカル・データベースに格納されているデータを処理するためのものです。リモート・データベースにマップされているグローバル・ノードはサポートされません。

共有メモリの考慮事項

並列処理では、InterSystems IRIS は複数のプロセス間キュー (IPQ) をサポートしています。各 IPQ が 1 つの並列クエリを処理します。これを使用することで、並列の作業ユニット・サブプロセスは、データの行をメイン・プロセスに送り返し、作業ユニットの完了をメイン・プロセスが待機する必要がなくなるようにすることができます。これにより、並列クエリは、クエリ全体の完了を待機することなく、できる限り迅速にデータの最初の行を返せるようになります。さらに、集約関数のパフォーマンスも向上します。

クエリの並列実行には、一般メモリ・ヒープ (gmheap) の共有メモリを使用します。SQL クエリの並列実行を使用するユーザは、gmheap のサイズを大きくすることが必要になる場合があります。

適切な gmheap の割り当てに失敗すると、messages.log にエラーが報告されます。SQL クエリは失敗する可能性があります。別のサブシステムが gmheap を割り当てようとすると、その他のエラーも発生する可能性があります。

インスタンスごとの gmheap の使用率 (特に IPQ の使用率など) を確認するには、管理ポータルのホーム・ページから [システム処理][システム使用] の順に選択して、[共有メモリヒープ使用状況] リンクをクリックします。詳細は、"監視ガイド" の “管理ポータルを使用した InterSystems IRIS の監視” の章にある "一般 (共有) メモリ・ヒープ使用状況" を参照してください。

SQL 文とプランの状態

%PARALLEL を使用する SQL クエリは、複数の SQL 文になることがあります。これに該当する SQL 文の [プランの状態] は、[未凍結/並列] になります。プランの状態が [未凍結/並列] のクエリは、ユーザの操作で凍結することはできません。詳細は、“SQL 文” の章を参照してください。

FeedbackOpens in a new tab