Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

並列クエリ処理の構成

並列クエリ・ヒントは、マルチプロセッサ・システムで実行されている場合にクエリの並列処理を実行するようシステムに指示します。これにより、特定のタイプのクエリのパフォーマンスを大幅に向上させることができます。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 の自動ヒントの有効化] オプションが表示されます。

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

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

Note:

%Runtime モードでコンパイルすると論理形式と表示形式または ODBC 形式との間で変換されるリテラル変数が使用されていて、ODBC モードでは実行されないサーバ側 SQL クエリを並列実行すると、正しくない結果が返されることが考えられます。このような状態を防止するには、該当のクエリに %NOPARALLEL を追加します。

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

オプションの %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 を指定しても並列処理は実行されません。クエリは正常に実行されてエラーは発行されませんが、並列処理は実行されません。

  • FOR SOME 述語を含むクエリ。

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

  • ON 節が等値条件ではない LEFT OUTER JOIN または INNER JOIN を含むクエリ。例えば、FROM %PARALLEL Sample.Person p LEFT OUTER JOIN Sample.Employee e ON p.dob > e.dob などです。これは、SQL 最適化により、このタイプの結合が FULL OUTER JOIN に変換されるために起きます。%PARALLEL は FULL OUTER JOIN の場合は無視されます。

  • %PARALLEL の最適化と %INORDER の最適化は同時に使用できません。両方を指定すると、%PARALLEL は無視されます。

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

  • テーブルに BITMAPEXTENT インデックスがある場合、COUNT(*) は並列処理を使用しません。

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

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

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

共有メモリの考慮事項

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

クエリの並列実行には、一般メモリ・ヒープ (gmheap) の共有メモリを使用します。SQL クエリの並列実行を使用するユーザは、gmheap のサイズを大きくすることが必要になる場合があります。原則として、各 IPQ のメモリ要件は 4 x 64k = 256k です。InterSystems IRIS は、並列 SQL クエリを使用可能な CPU コア数に分割します。そのため、この追加の gmheap をユーザが割り当てる必要があります。

<Number of concurrent parallel SQL requests> x <Number cores> x 256 = <required size increase (in kilobytes) of gmheap>

この式に 100% の正確性はありません。並列クエリは同じく並列のサブ・クエリを生成することがあるためです。したがって、この式で指定された値よりも多くの gmheap を割り当てることが賢明です。

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

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

gmheap (共有メモリ・ヒープまたは SMH とも呼びます) のサイズを変更するには、管理ポータルのホーム・ページで [システム管理][構成][追加設定][メモリ詳細] の順に選択します。詳細は、"システム管理ガイド" の "“InterSystems IRIS の構成”" の章で "メモリと開始設定" を参照してください。

クエリ・キャッシュの考慮事項

%PARALLEL が指定されたキャッシュ済み SQL クエリを実行しているとき、クエリ・キャッシュが削除されるような処理をこの SQL クエリの初期化中に実行すると、その SQL クエリは、いずれかのワーカ・ジョブから報告された <NOROUTINE> エラーを受け取ることがあります。クエリ・キャッシュが削除される原因となる主なアクションとして、$SYSTEM.SQL.Purge() の呼び出しや、そのクエリが参照するクラスのリコンパイルなどがあります。クラスをリコンパイルすると、そのクラスに関連するクエリ・キャッシュは自動的に削除されます。

通常、このエラーが発生した場合は、もう一度クエリを実行することで正常に実行されます。クエリから %PARALLEL を削除すると、このエラーは発生しなくなります。

SQL 文とプランの状態

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

FeedbackOpens in a new tab