Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

クエリ・パフォーマンスの最適化

Caché SQL は、クエリ・オプティマイザを自動的に使用して、ほとんどの環境でクエリのパフォーマンスを最適化するクエリ・プランを作成します。このオプティマイザは、さまざまな方法でクエリのパフォーマンスを向上させます。例えば、どのインデックスを使用するかを判断する、複数の AND 条件の評価順序を判断する、複数の結合を実行するときのテーブルの順序を判断するなど、多数の最適化操作を使用します。クエリの FROM 節では、オプティマイザに"ヒント" を与えることができます。この章では、クエリ・プランを評価する際に使用できるツール、および特定のクエリを Caché SQL が最適化する方法を変更する際に使用できるツールついて説明します。

Caché は、SQL クエリの最適化に向けた以下のツールをサポートしています。

  • SQL 実行時統計は、クエリの実行に関するパフォーマンス統計を生成します。

  • インデックス分析は、現在のネームスペースのすべてのクエリに関するさまざまなインデックス分析レポートを表示します。これにより、Caché SQL がクエリを実行する方法が示され、インデックスの使用状況についての全体像が得られます。このインデックス分析により、パフォーマンス向上のために 1 つ以上のインデックスの追加が必要になることが示される場合があります。

  • プラン表示は、SQL クエリの最適な (既定の) 実行プランを表示します。

  • 代替表示プランは、SQL クエリに使用可能な代替の実行計画を統計と共に表示します。

  • インデックス最適化オプションは、FROM 節オプションですべての条件を制御するか、個別の条件の前に %NOINDEX を付けて使用できます。

  • クエリの並列処理には、FROM 節オプションの %PARALLEL キーワードを使用できます。このオプションを使用すると、マルチプロセッサ・システムはクエリの実行をプロセッサ間で分割できます。

以下の SQL クエリのパフォーマンス・ツールは、このマニュアルの別の章で説明しています。

  • クエリ・キャッシュにより、ダイナミック SQL クエリは、実行のたびにクエリを準備するオーバーヘッドを回避して再実行できるようになります。

  • SQL 文は、直前にコンパイルされた埋め込み SQL クエリを保持します。“SQL 文と凍結プラン” の章を参照してください。

  • 凍結プランは、埋め込み SQL クエリの特定のコンパイルを保持します。このコンパイルが、より最近のコンパイルの代わりに使用されます。“SQL 文と凍結プラン” の章を参照してください。

以下のツールは、テーブル・データを最適化するために使用されるため、対象のテーブルに対するすべてのクエリに大きな効果が得られます。

  • インデックスの定義により、特定のインデックス付きフィールドに含まれるデータへのアクセスが大幅に高速化されます。

  • ExtentSize、Selectivity、および BlockCount では、テーブルにデータを移入する前に、テーブル・データの見積もりを指定します。このメタデータは、今後のクエリを最適化するために使用されます。

  • テーブルのチューニング では、データが移入されているテーブル内の代表的なテーブル・データを分析します。これにより生成されたメタデータは、今後のクエリを最適化するために使用されます。

この章では、クエリ最適化プランをファイルに書き込む方法と、インターシステムズ WRC に送信する SQL トラブルシューティング・レポートの生成方法についても説明します。

管理ポータルの SQL パフォーマンス・ツール

Caché 管理ポータル から、以下の SQL パフォーマンス・ツールを利用できます。管理ポータルから、[システム・エクスプローラ] オプションを選択します。ここから [ツール][SQL パフォーマンス・ツール] を選択し、以下に示す SQL パフォーマンス・ツールの 1 つを選択します。

  • SQL 実行時統計は、クエリの実行に関するパフォーマンス統計を生成します。

  • インデックス分析は、現在のネームスペースのすべてのクエリに関するさまざまなインデックス分析レポートを表示します。これにより、Caché SQL がクエリを実行する方法が示され、インデックスの使用状況についての全体像が得られます。このインデックス分析により、パフォーマンス向上のために 1 つ以上のインデックスの追加が必要になることが示される場合があります。

  • 代替表示プランは、SQL クエリに使用可能な代替実行プランを統計と共に表示します。

  • [レポート生成] は、SQL パフォーマンス・レポートをインターシステムズ WRC (インターシステムズのカスタマ・サポート窓口) に送信するために使用します。このレポート・ツールを使用するには、最初に WRC から WRC 追跡番号を取得する必要があります。

  • [レポートのインポート] は、インターシステムズのみが使用します。

SQL 実行時統計

SQL 実行時統計を使用すると、システム上でのクエリ実行のパフォーマンスを測定できます。SQL 実行統計では、SELECTINSERTUPDATE および DELETE 操作 (これらを総称してクエリ操作と呼びます) のパフォーマンスを測定します。この機能は既定では無効にされています。機能の有効化後には、SQL クエリを再コンパイルする必要があります。

Caché 管理ポータルまたは %SYS.PTools.SQLStatsOpens in a new tab クラスを使用して、SQL クエリでパフォーマンス統計を収集することができます。このクラスを使用すると、各 SQL クエリのコンパイル時間、グローバル参照の数、実行されたコードの行数、モジュールの呼び出し回数、総実行時間、最初の行を返すまでの時間、ディスク待機時間 (ミリ秒単位のディスクの読み取りアクセス時間)、および処理された行数を確認できます。

クエリのパフォーマンス統計の収集

パフォーマンス統計を収集するには、以下のいずれかを使用して統計 (Stats) コードの生成を有効にする必要があります。

  • 管理ポータルの [SQL 実行時統計] タブ (管理ポータルから、[システム・エクスプローラ][ツール][SQL パフォーマンス・ツール][SQL 実行時統計] の順に選択します)。

  • SetSQLStats()Opens in a new tab メソッドまたは SetSQLStatsJob()Opens in a new tab メソッド

これらのインタフェースのいずれかの場合は、次のオプションの 1 つを指定します。0 の場合は統計のコード生成が無効になり、1 の場合はすべてのクエリに対して統計のコード生成が有効になりますが統計の収集は行われません (既定)。2 の場合はクエリの外部ループのみの統計を記録し (クエリのオープンおよびクローズ時に統計を収集)、3 の場合はクエリのすべてのモジュール・レベルに対して統計を記録します。モジュールは入れ子にすることができます。その場合、MAIN モジュールの統計が包含的な数となり、全クエリに対する全体的な結果となります。

SetSQLStatsJob() の場合のオプションはわずかに異なります。次のようなオプションがあります。-1 を指定すると、このジョブの統計が無効になり、0 を指定すると、システム設定値が使用されます。1、2、および 3 のオプションは SetSQLStats() と同様であり、システム設定がオーバーライドされます。既定値は 0 です。

SQL 統計データを収集するには、統計コードの生成をオン (オプション 1、既定値) にしてクエリをコンパイルする必要があります。

  • 0 から 1 に変更する場合:SQL 統計オプションの変更後、SQL を含んでいる実行時のルーチンとクラスは統計コードの生成を実行するためにコンパイルする必要があります。xDBC およびダイナミック SQL については、コードの生成を強制するために、クエリ・キャッシュを削除する必要があります。

  • 1 から 2 に変更する場合:SQL 統計オプションを変更するだけで、統計の収集が開始されます。これにより、最短の中断で稼働中のプロダクション環境に関する SQL パフォーマンスの分析を実行できるようになります。

  • 1 から 3 (または 2 から 3) に変更する場合:SQL 統計オプションの変更後、SQL を含んでいる実行時のルーチンとクラスは、すべてのモジュール・レベルの統計を記録するためにコンパイルする必要があります。xDBC およびダイナミック SQL については、コードの生成を強制するために、クエリ・キャッシュを削除する必要があります。一般に、オプション 3 は、非プロダクション環境で特定したパフォーマンスの低いクエリにのみ使用します。

  • 1,2,または 3 から 0 に変更する場合:統計コードの生成をオフにするために、クエリ・キャッシュを削除する必要はありません。

この情報は %SYS.PTools.SQLQueryOpens in a new tab および %SYS.PTools.SQLStatsOpens in a new tab に保存されています。

クエリ・キャッシュを削除すると、関連するすべての SQL 統計データが削除されます。テーブルまたはビューを削除すると、関連するすべての SQL 統計データが削除されます。

クエリ・パフォーマンス統計の表示

以下の方法で SQL クエリのパフォーマンス統計を表示できます。

  • 管理ポータルから、[システム・エクスプローラ][ツール][SQL パフォーマンス・ツール][SQL 実行時統計] の順に選択し、[統計の表示] タブをクリックします。これにより、このシステムで収集された実行時統計の全体像が得られます。

    [統計の表示] 列をクリックすると、クエリ統計をソートできます。その後で、特定のクエリの [プラン表示] をクリックします。

  • 以下の例のように %SYS.PTools.SQLStatsOpens in a new tab クラスの GetLastSQLStats()Opens in a new tab メソッドを使用します。

      ZNSPACE "Samples"
      DO $SYSTEM.SQL.SetSQLStatsJob(2)
      SET myquery = "SELECT TOP 5 Name,DOB FROM Sample.Person"
      SET tStatement = ##class(%SQL.Statement).%New()
      SET qStatus = tStatement.%Prepare(myquery)
        IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      SET rset = tStatement.%Execute()
      DO rset.%Display()
      WRITE !,"end of query result set",!!
      KILL rset
      DO ##class(%SYS.PTools.SQLStats).GetLastSQLStats()
      DO %sqlcontext.DumpResults()
  • 以下の例のようにストアド・プロシージャを呼び出します。

      ZNSPACE "Samples"
      DO $SYSTEM.SQL.SetSQLStatsJob(2)
      SET myquery = "SELECT TOP 5 Name,DOB FROM Sample.Person"
      SET tStatement = ##class(%SQL.Statement).%New()
      SET qStatus = tStatement.%Prepare(myquery)
        IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
      SET rset = tStatement.%Execute()
      DO rset.%Display()
      WRITE !,"end of query result set",!!
      KILL rset
      &sql(CALL %SYS_PTools.GetLastSQLStats())
      DO %sqlcontext.DumpResults()

以下の例では、INSERT 文から実行時統計を収集します。

CreateATable
  &sql(CREATE TABLE sample.sqltest (FullName VARCHAR(25),MyDate DATE DEFAULT CURRENT_DATE))
    IF SQLCODE=0 { WRITE "sqltest table created",! }
    ELSE {WRITE "table create failed SQLCODE=",SQLCODE,! }
InsertData
  SET oldstat=$SYSTEM.SQL.SetSQLStatsJob(2)
  &sql(INSERT INTO sample.sqltest(FullName) SELECT Name FROM Sample.Person WHERE Name BETWEEN 'A' AND 'J')
  WRITE "Inserted ",%ROWCOUNT," rows in table SQLCODE=",SQLCODE,!
  DO ##class(%SYS.PTools.SQLStats).GetLastSQLStats()
  DO %sqlcontext.DumpResults()
Cleanup
   DO $SYSTEM.SQL.SetSQLStatsJob(oldstat)
   &sql(DROP TABLE sample.sqltest)

以下の例に示すように、SQLStatsView クエリを使用して、これらの統計を表示することができます。

  ZNSPACE "Samples"
  DO ##class(%SYS.PTools.SQLStats).Purge("Samples")
  DO ##class(%SYSTEM.SQL).SetSQLStatsJob(2)
  SET myquery = "SELECT TOP 5 Name,DOB FROM Sample.Person"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(myquery)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"end of query result set",!!
  KILL rset
  DO ##class(%ResultSet).RunQuery("%SYS.PTools.SQLStats","SQLStatsView")
  WRITE !!,"End of SQL Statistics"

クエリ・パフォーマンス統計のエクスポート

クエリ・パフォーマンス統計はテキスト・ファイルにエクスポートできます。既定では、このテキスト・ファイルの列はタブで区切られています。ファイル名の引数を指定しない場合、これらのメソッドにより Mgr ディレクトリに .psql ファイルが作成されます。その際、ユーザのシステム ID、Caché のインストール・ディレクトリ、Caché のバージョンがファイル名の生成に使用されます。ファイル名の引数を指定した場合、これらのメソッドにより現在のネームスペースの Mgr サブディレクトリ、または指定したパスの位置にファイルが作成されます。このエクスポートは、現在のネームスペース内のデータに限られます。

実行時統計とプラン表示

[SQL 実行時統計] ツールは、実行時統計を含むクエリのプラン表示を表示するために使用できます。

[代替表示プラン] ツールは、クエリの実行時統計を表示して、プラン表示を統計と比較するために使用できます。[プラン表示のオプション][代替表示プラン] ツールには、クエリの推定統計が表示されます。実行時統計の収集がアクティブにされていると、[プラン表示を統計と比較] オプションにより、実際の実行時統計が表示されます。実行時統計がアクティブでない場合、このオプションにより推定統計が表示されます。

インデックスの使用

インデックスは、頻繁に要求されるデータのサブセットをソートして管理することで、クエリを最適化するメカニズムを提供します。どのフィールドにインデックスを定義すべきかを決定する際にも、注意が必要です。インデックスが少なすぎる場合や、間違っている場合は、主要なクエリの速度が大きく低下します。また、インデックスが多すぎる場合は、INSERTUPDATE のパフォーマンスが低下します (インデックス値を設定または更新する必要があるため)。

インデックスの対象

インデックスの追加によってクエリのパフォーマンスが向上するかどうかを判断するには、管理ポータルの SQL インタフェースからクエリを実行して、[パフォーマンス] のグローバル参照の数をメモします。インデックスを追加してからクエリを再度実行して、グローバル参照の数をメモします。インデックスが有用な場合は、グローバル参照の数が少なくなります。インデックスの使用を抑止するには、WHERE 節または ON 節の条件の前に %NOINDEX キーワードを使用します。

JOIN で指定されるフィールド (プロパティ) のインデックスを作成します。LEFT OUTER JOIN では、左のテーブルから開始し、その後、右のテーブルを調査します。そのため、右のテーブルのフィールドからインデックスを作成する必要があります。以下の例では、T2.f2 のインデックスを作成します。

   FROM Table1 AS T1 LEFT OUTER JOIN Table2 AS T2 ON T1.f1 = T2.f2

INNER JOIN には、両方の ON 節のフィールドに対するインデックスが必要です。

プラン表示を実行して、最初のマップをたどります。クエリ・プランの最初の箇条項目が "Read master map" の場合や、最初の箇条項目が "Read master map" のモジュールをクエリ・プランが呼び出す場合は、クエリの最初のマップはインデックス・マップではなくマスタ・マップになります。テーブルが比較的小さなものでない限り、このクエリを再実行したときにクエリ・プランの最初のマップに [インデックス・マップの読み取り] と表示されるようにインデックスを作成する必要があります。

WHERE 節の等値条件で指定されるフィールドのインデックスを作成します。

WHERE 節の範囲条件で指定されるフィールドや GROUP BY 節および ORDER BY 節で指定されるフィールドのインデックスを作成することが必要になる場合もあります。

範囲条件に基づくインデックスでは、クエリの速度が遅くなる場合があります。大部分の行が指定された範囲条件を満たす場合にこのようになる可能性があります。例えば、レコードの大部分が前の日付を持つデータベースでクエリ節 WHERE Date < CURRENT_DATE を使用する場合に、Date にインデックスを作成すると、クエリの速度が大幅に低下します。この原因は、クエリ・オプティマイザは、範囲条件で返される行は比較的少ないと仮定し、この状況に合わせて最適化するからです。これが発生しているかどうかは、範囲条件の前に %NOINDEX を配置してクエリを再度実行することで判断できます。

インデックスが作成されているフィールドを使用して比較を実行する場合、その比較に指定するフィールドの照合タイプは、対応するインデックスの照合タイプと同じにする必要があります。例えば、SELECT の WHERE 節または JOIN の ON 節の Name フィールドは、その Name フィールドに定義されたインデックスと同じ照合にする必要があります。フィールドの照合とインデックスの照合に不一致があると、インデックスの効果が低下するか、インデックスがまったく使用されなくなります。詳細は、このドキュメントの “インデックスの定義と構築” の章の "インデックス照合" を参照してください。

インデックスの作成方法と使用可能なインデックスのタイプとオプションの詳細は、"Caché SQL リファレンス" の CREATE INDEX コマンドと、このドキュメントの “インデックスの定義と構築” の章を参照してください。

インデックス構成オプション

以下のシステム全体の構成メソッドは、クエリでインデックスの使用を最適化するために使用できます。

詳細は、"Caché 詳細構成設定リファレンス" で説明されている SQL 構成設定を参照してください。

インデックス使用の分析

以下のいずれかを使用して、SQL クエリ・キャッシュのインデックス使用を分析できます。

インデックス分析

管理ポータルの [ツール] インタフェースから、[システム・エクスプローラ][ツール][SQL パフォーマンス・ツール][インデックス分析] の順に選択します。現在のネームスぺースの SQL 文カウントが表示され、4 つのインデックス分析レポート・オプションが提供されます。

SQL 文カウント

[SQL インデックス・アナライザ] の上部には、ネームスペースに含まれるすべての SQL 文をカウントするオプションがあります。[SQL 文の収集] ボタンをクリックします。[SQL インデックス・アナライザ] はカウントの処理中に “SQL 文の収集中 ....” と表示し、カウントが完了すると “完了” と表示します。SQL 文は、クエリ・キャッシュのカウント、クラス・メソッドのカウント、およびクラス・クエリのカウントという 3 つのカテゴリでカウントされます。これらのカウントは、現在のネームスペース全体に対するものであり、[システム・クエリを含めますか?] オプションや [スキーマ選択] オプションの影響を受けません。

ただし、[レポート・オプション][スキーマ選択] を指定して [SQL インデックス・アナライザ] を実行すると、1 つのクエリ・キャッシュが生成される点に注意してください。[インデックス使用] オプションを実行すると、さらに 3 つの ([スキーマ選択] が指定されている場合は合計で 4 つの) クエリ・キャッシュが生成されます。こうして生成されたクエリ・キャッシュは、その後の [SQL 文の収集] の使用時にカウントされるようになります。別のスキーマ選択を選んで別の [レポート・オプション] の使用を繰り返したとしても、追加のクエリ・キャッシュは生成されません。

対応するメソッドは、%SYS.PTools.SQLUtilitiesOpens in a new tab クラスの GetSQLStatements()Opens in a new tab です。

レポート・オプション

現在のネームスペース内の選択済みスキーマのクエリ・キャッシュのレポートを確認するか、(スキーマが選択されていない場合) 現在のネームスペース内のすべてのクエリ・キャッシュのレポートを確認できます。この分析には、システム・クエリを含めることも、除外することもできます。インデックス分析レポート・オプションを以下に示します。

  • インデックス使用:このオプションは、現在のネームスペース内のすべてのクエリ・キャッシュを取得し、それぞれにプラン表示を生成します。さらに、各インデックスが各クエリに使用された回数とネームスペース内のすべてのクエリによる各インデックスの合計使用量のカウントを保持します。これを使用して、使用されていないインデックスを明らかにし、削除したり役立つように変更することができます。結果セットは、最少使用のインデックスから最多使用のインデックスに向けて順序付けされます。

    対応するメソッドは、%SYS.PTools.SQLUtilitiesOpens in a new tab クラスの IndexUsage()Opens in a new tab です。

  • テーブル・スキャンを行うクエリ:このオプションは、テーブル・スキャンを実行する現在のネームスペース内のすべてのクエリを識別します。可能な限り、テーブル・スキャンは回避する必要があります。テーブル・スキャンを常に防ぐことはできませんが、テーブルに多数のテーブル・スキャンがある場合は、テーブルに定義されているインデックスを確認する必要があります。多くの場合、テーブル・スキャンのリストと一時インデックスのリストは重複します。一方を固定して、もう一方を削除します。結果セットでは、最大ブロック・カウントから最小ブロック・カウントの順にテーブルがリストされます。[プラン表示] リンクにより、[文テキストとクエリ・プラン] が表示されます。

    対応するメソッドは、%SYS.PTools.SQLUtilitiesOpens in a new tab クラスの TableScans()Opens in a new tab です。

  • 一時インデックスのクエリ:このオプションは、SQL を解決するための一時インデックスを構築する、現在のネームスペース内のすべてのクエリを識別します。場合によっては、一時インデックスの使用が役立ち、パフォーマンスが向上します。例えば、マスタ・マップを Caché で順序どおりに読み込むために使用できる、範囲条件に基づく小さなインデックスを構築するなどです。一時インデックスは別のインデックスの単純なサブセットとして非常に効率が良い場合があります。また、一時インデックスがパフォーマンスの低下につながることもあります。例えば、条件を含むプロパティに対する一時インデックスを構築するために、マスタ・マップをスキャンする場合です。この状況は、必要なインデックスが見つからないことを意味します。インデックスは、一時インデックスと一致するクラスに追加する必要があります。結果セットでは、最大ブロック・カウントから最小ブロック・カウントの順にテーブルがリストされます。[プラン表示] リンクにより、[文テキストとクエリ・プラン] が表示されます。

    対応するメソッドは、%SYS.PTools.SQLUtilitiesOpens in a new tab クラスの TempIndices()Opens in a new tab です。

  • JOIN インデックスがないクエリ:このオプションは、現在のネームスペース内で結合が含まれるすべてのクエリを検証し、その結合をサポートするために定義されたインデックスがあるかどうかを判断します。結合のサポートに利用できるインデックスはランク付けされます。このランクは、0 (インデックスが存在しない) から 4 (結合を完全にサポートするインデックス) までの範囲になります。外部結合では、1 方向のインデックスが必要です。内部結合では、双方向のインデックスが必要です。結果セットには、JoinIndexFlag < 4 がある行のみが含まれます。JoinIndexFlag=4 は、結合を完全にサポートするインデックスがあることを意味します。これらはリスト表示されません。

    対応するメソッドは、%SYS.PTools.SQLUtilitiesOpens in a new tab クラスの JoinIndices()Opens in a new tab です。これは、JoinIndexFlag の値の説明を提供します。

これらのオプションのいずれかを選択すると、自動的に操作が実行されて、結果が表示されます。オプションを初めて選択したとき、または対応するメソッドを初めて呼び出したときに結果データが生成されます。そのオプションを再度選択しても、そのメソッドを再度呼び出しても、Caché は同じ結果を再表示します。新しい結果データを生成するには、[SQL 文の収集] ボタンを使用して、インデックス・アナライザの結果テーブルを再初期化する必要があります。%SYS.PTools.SQLUtilitiesOpens in a new tab のメソッドの新しい結果データを生成するには、GetSQLStatements()Opens in a new tab を呼び出して、インデックス・アナライザの結果テーブルを初期化する必要があります。[システム・クエリを含めますか?] チェック・ボックス・オプションを変更することでも、インデックス・アナライザの結果テーブルを再初期化できます。

IndexUsage() メソッド

以下の例では、IndexUsage()Opens in a new tab メソッドの使用法を示します。

  ZNSPACE "Samples"
  DO ##class(%SYS.PTools.SQLUtilities).IndexUsage(1)
  SET utils = "SELECT %EXACT(Type), Count(*) As QueryCount "_
              "FROM %SYS_PTools.SQLUtilities GROUP BY Type"
  SET utilresults = "SELECT SchemaName, Tablename, IndexName, UsageCount "_
                    "FROM %SYS_PTools.SQLUtilResults ORDER BY UsageCount"
  SET tStatement = ##class(%SQL.Statement).%New()
  SET qStatus = tStatement.%Prepare(utils)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of utilities data",!!
  SET qStatus = tStatement.%Prepare(utilresults)
   IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
  SET rset = tStatement.%Execute()
  DO rset.%Display()
  WRITE !,"End of results data"

結果は UsageCount 順になるので、UsageCount > 0 のインデックスは結果セットの最後にリストされます。

インデックスの最適化オプション

既定で、Caché SQL クエリ・オプティマイザは、高度で柔軟性の高いアルゴリズムを使用して複数のインデックスを含む複雑なクエリのパフォーマンスを最適化します。ほとんどの場合、これらの既定によってパフォーマンスが最適化されます。ただし、optimize-option キーワードを指定することで、クエリ・オプティマイザに “ヒント” を与えることもできます。

FROM 節では、%ALLINDEX および %IGNOREINDEX の optimize-option キーワードがサポートされています。これらの optimize-option キーワードは、クエリ内のすべてのインデックスの使用を制御します。これらの詳細は、"Caché SQL リファレンス" の FROM 節のリファレンス・ページを参照してください。

条件レベル・ヒント %NOINDEX を使用すると、特定の条件のインデックスの使用に対する例外を指定できます。%NOINDEX ヒントは、インデックスを使用しない各条件の前に配置します。例えば、WHERE %NOINDEX hiredate < ? のようにします。通常、この方法は条件によって圧倒的多数のデータが選択される (または選択されない) 場合に使用します。「より小さい (<)」または「より大きい (>)」条件では、通常、条件レベル・ヒント %NOINDEX を使用すると効果的です。等価条件では、条件レベル・ヒント %NOINDEX を使用しても効果はありません。結合条件では、%NOINDEX は、WHERE 節の外部結合 =* および *= ではサポートされませんが、ON 節の結合ではサポートされます。

%NOINDEX キーワードを使用すると、FROM 節で確立されたインデックス最適化をオーバーライドできます。以下の例では、%ALLINDEX 最適化のキーワードが E.Age 条件を除くすべての条件テストに適用されます。

  SELECT P.Name,P.Age,E.Name,E.Age
  FROM %ALLINDEX Sample.Person AS P LEFT OUTER JOIN Sample.Employee AS E
       ON P.Name=E.Name
  WHERE P.Age > 21 AND %NOINDEX E.Age < 65

プラン表示

[プラン表示] には、SELECTUPDATEDELETETRUNCATE TABLE、および一部の INSERT 操作の実行計画が表示されます。これらは、実行の一環として SELECT を使用するため、総称してクエリ操作と呼びます。[プラン表示] は、クエリ操作が準備されたときに実行されます。実行プランを生成するために、実際にクエリ操作を実行する必要はありません。

[プラン表示] には、Caché が最適であると見なした実行プランの内容が表示されます。ただし、ほとんどのクエリには、有効な実行計画が複数存在します。代替表示プランを表示することもできます。

実行プランの表示

[プラン表示] を使用すると、以下のどの方法でもクエリの実行プランを表示できます。

  • 管理ポータルの [SQL] インタフェースから。[システム・エクスプローラ][SQL] の順に選択します。ページ上部の [切り替え] オプションでネームスペースを選択します (ユーザごとに管理ポータルの既定ネームスペースを設定できます)。クエリを作成します (テキスト・ボックスに入力するか、[クエリ・ビルダ] を使用する)。次に [プラン表示] ボタンを押します (一覧表示されているクエリのプラン・オプションをクリックして、[履歴を表示] から [プラン表示] を呼び出すこともできます)。このドキュメントの“管理ポータルの SQL インタフェースの使用法” の章の "SQL 文の実行" を参照してください。

  • 管理ポータルの [ツール] インタフェースから、[システム・エクスプローラ][ツール][SQL パフォーマンス・ツール][SQL 実行時統計] の順に選択します。

    • [クエリ・テスト] タブから、ページ上部の [切り替え] オプションでネームスペースを選択します。テキスト・ボックスにクエリを入力します。次に、[SQL 統計によるプラン表示] ボタンを押します。これにより、クエリを実行することなく [プラン表示] を生成します。

    • [統計の表示] タブで、リストされているいずれかのクエリの [プラン表示] ボタンを押します。リストされているクエリには、[クエリ実行] (システム, SQL) で記述されたクエリと、[クエリ・テスト] (システム, SQL 実行時統計) で記述されたクエリの両方が含まれます。

  • 以下の例のように ShowPlan()Opens in a new tab メソッドを実行します。

      ZNSPACE "Samples"
      SET oldstat=$SYSTEM.SQL.SetSQLStatsJob(3)
      SET mysql=2
      SET mysql(1)="SELECT TOP 10 Name,DOB FROM Sample.Person "
      SET mysql(2)="WHERE Name [ 'A' ORDER BY Age"
      DO $SYSTEM.SQL.ShowPlan(.mysql,0,1)
      DO $SYSTEM.SQL.SetSQLStatsJob(oldstat)
  • プロパティとして格納されているリテラル置換値の :i%Prop syntax を使用して、キャッシュ・クエリの結果セットに対してプラン表示を実行します。

      ZNSPACE "Samples"
      SET cqsql=2
      SET cqsql(1)="SELECT TOP :i%PropTopNum Name,DOB FROM Sample.Person "
      SET cqsql(2)="WHERE Name [ :i%PropPersonName ORDER BY Age"
      DO ShowPlan^%apiSQL(.cqsql,0,"",0,$LB("Sample"),"",1)

既定では、[プラン表示] は論理モードで値を返します。ただし、管理ポータルまたは SQL Shell から [プラン表示] を呼び出すと、[プラン表示] は実行時モードを使用します。

実行プラン:文テキストとクエリ・プラン

[プラン表示] の実行計画は、文テキストとクエリ・プランという 2 つのコンポーネントで構成されます。

[文テキスト] は、以下の変更によって、元のクエリをレプリケートします。管理ポータル の [SQL] インタフェースにある [プラン表示] ボタンにより、DECLARE QRS CURSOR FOR (QRS はクエリ結果セット) を前に付けた SELECT クエリが表示されます。これは、[プラン表示] で凍結プランを使用できるようにすることにより行われます。[プラン表示] ボタンは、各リテラルを ? で置換するリテラル置換の実行も表示します。ただし、二重の括弧でリテラル値を囲むことで、リテラル置換を抑制している場合を除きます。このような変更は、ShowPlan() メソッドを使用してプラン表示を表示したときや、代替表示プランを表示したときには行われません。

[クエリプラン] には、クエリの実行に使用されるプランが示されます。[クエリプラン] は、以下の内容で構成されます。

  • [Frozen Plan凍結プラン] は、クエリ・プランが凍結されている場合に、[クエリプラン] の先頭行に表示されます。それ以外の場合、先頭行は空白になります。

  • [相対コスト] は、2 つのクエリの効率を比較するための抽象的な数値として、多数の要因から計算される整数値です。この計算では、さまざまな要因の中でも特にクエリの複雑さ、インデックスの有無、およびテーブルのサイズが考慮に入れられます。WHERE 節を指定していない COUNT(*) または MAX(%ID) などの特定の集約クエリによって “Relative cost not available” が返されます。

  • [クエリプラン] は、メイン・モジュールと 1 つ以上のサブコンポーネント (必要な場合) で構成されます。1 つ以上のモジュール・サブコンポーネントが表示される場合は、B から始まるアルファベット順の名前が付けられ (Module BModule C など)、実行順にリストされます (アルファベット順とは限りません)。アルファベットの最後に達すると、それ以降のモジュールには、Z=26 と解析して番号が付けられます。つまり、Module Z の次のモジュールは Module 27 になります。モジュールは、処理を実行して、その結果を内部的な一時ファイル (内部一時テーブル) に入力します。

    1 つ以上のサブクエリのサブコンポーネントが表示されることがあります。各サブクエリは、個別のサブクエリ・モジュールとして、クエリで指定されている順序で表示されます。サブクエリ・モジュールに名前は付けられません。サブクエリがモジュールを呼び出した場合、そのモジュールは、サブクエリの後に配置され、適切な不連続のアルファベット名が付けられます。このため、1 つのクエリ・プランに、Module B を呼び出すメイン・モジュールと Module H を呼び出す Subquery が含まれる場合があります。

  • メイン・モジュールの最初の箇条項目が “Read master map” である場合、非効率的なクエリ・プランを示します。クエリ・プランは、Read master map... (使用可能なインデックスがない)、Read index map... (使用可能なインデックスを使用)、または Generate a stream of idkey values using the multi-index combination... (マルチ・インデックス、複数のインデックスを使用) のいずれかのマップ・タイプの文で実行を開始します。マスタ・マップは、データに対するインデックスではなくデータ自体を読み取るため、ほとんどの場合、Read master map... は非効率的なクエリ・プランを示します。テーブルが比較的小さなものでない限り、クエリ・プランを再生成したときに最初のマップに Read index map... と表示されるように、インデックスを定義する必要があります。クエリ・プランの解釈の詳細は、"SQL クエリ・プランの解釈" を参照してください。

一部の操作では、クエリ・プランが生成されない可能性のあることを示す [プラン表示] が作成されます。

  • 非クエリの INSERT:INSERT... VALUES() コマンドはクエリを実行しません。そのため、クエリ・プランは生成されません。

  • 常に FALSE のクエリ:Caché は、クエリ条件が常に false になるためにデータを返せないクエリを準備している場合を判断できます。この状況は、[プラン表示] の [クエリプラン] コンポーネントで通知されます。例えば、条件 WHERE %ID IS NULL または条件 WHERE Name %STARTSWITH('A') AND Name IS NU L を含むクエリはデータを返せないため、Caché は実行プランを生成しません。実行プランを生成する代わりに、[クエリプラン] は “Output no rows” というメッセージを示します。クエリに、これらの条件のいずれかを指定したサブクエリが含まれている場合、そのサブクエリ・モジュールについての [クエリプラン] には “Subquery result NULL, found no rows” というメッセージが表示されます。この条件チェックは、NULL が関与するいくつかの状況に制限されていて、自己矛盾するクエリ条件のすべてを補足することを意図していません。

  • 不正なクエリ:[プラン表示] には、ほとんどの不正なクエリに対して SQLCODE エラー・メッセージを表示します。ただし、[プラン表示] は空として表示することもあります。例えば、WHERE Name = $$$$$WHERE Name %STARTSWITH('A") (単一引用符と二重引用符に注目してください) などが挙げられます。このような場合、[プラン表示] には [文テキスト] が表示されません。また、[クエリプラン] には [No plan created for this statement] というメッセージが表示されます。一般に、これはリテラルを区切っている引用符が釣り合っていない場合に発生します。また、ユーザ定義 ("外部") 関数に正しい構文を指定しないで、複数のドル記号を先頭に指定した場合にも発生します。

代替表示プラン

管理ポータルまたは ShowPlanAlt() メソッドを使用して、クエリの代替実行プランを表示できます。

管理ポータルの [システム・エクスプローラ] から、[ツール][SQL パフォーマンス・ツール][代替表示プラン] の順に選択します。このツールを使用して、クエリを入力してから [表示プラン・オプション] ボタンを押して、複数の代替表示プランを表示します。比較するプランを複数選択してから、それらを実行するために [プラン表示を統計と比較] ボタンを押して、それぞれの SQL 統計を表示します。

ShowPlanAlt()Opens in a new tab メソッドを使用すると、1 つのクエリの実行プランがすべて表示されます。これは、Caché が最適 (最小コスト) であると見なしたプランを最初に示します。これは、ShowPlan() メソッドと同じ [プラン表示] の表示になります。その後で、ShowPlanAlt() によって、代替プランの表示を選択できるようになります。代替プランは、コストの昇順でリストされます。プロンプトで代替プランの ID 番号を指定して、その実行プランを表示します。その後、ShowPlanAlt() は別の代替プランの ID の入力を求めるプロンプトを表示します。このユーティリティを終了するには、そのプロンプトで Enter キーを押します。

以下の例では、ShowPlan() の例と同じ実行プランが表示された後で代替プランがリスト表示され、表示する代替プランの指定を求めるプロンプトが出されます。

  ZNSPACE "Samples"
  DO $SYSTEM.SQL.SetSQLStatsJob(3)
  SET mysql=1
  SET mysql(1)="SELECT TOP 4 Name,DOB FROM Sample.Person ORDER BY Age"
  DO $SYSTEM.SQL.ShowPlanAlt(.mysql,0,1)

代替プランを表示するには、表示されたリストからプランの ID 番号を指定し、Enter キーを押します。ShowPlanAlt() を終了するには、単に Enter キーを押します。

%SYS.PTools.SQLUtilitiesOpens in a new tab クラス内の PossiblePlans メソッドも参照してください。

統計

[プラン表示オプション] リストでは、各代替表示プランに [コスト] 値を割り当てます。この値により、実行プラン間での相対的な比較が可能になります。

[代替表示プラン] の詳細には、[クエリプラン] ごとに [クエリの合計] についての統計 (Stats) のセットが示されます。(該当する場合は) クエリ・プラン・モジュールごとにも、これが示されます。各モジュールの統計には、時間 (ミリ秒単位での全体的なパフォーマンス)、グローバル (グローバル参照の数)、コマンド (実行されたコマンドの数)、およびディスク待機時間 (ミリ秒単位でのディスク読み込みの遅延) が含まれます。[クエリの合計] の統計には、[行] (返される行の数) も含まれます。

クエリ最適化プランをファイルに書き込む

以下のユーティリティは、1 つ以上のクエリのクエリ最適化プランをテキスト・ファイルにリストします。

QOPlanner^%apiSQL(infile,outfile,eos,schemapath)
infile クエリ・キャッシュのリストを含むテキスト・ファイルのファイル・パス名。引用符で囲んだ文字列で指定します。
outfile クエリ最適化プランをリストするファイルのパス名。引用符で囲んだ文字列で指定します。ファイルが存在しない場合は、作成されます。ファイルが既に存在する場合は、Caché によりファイルが上書きされます。
eos オプションinfile リスト内の個々のクエリ・キャッシュを分離するために使用される文末区切り文字。引用符で囲んだ文字列で指定します。既定は “GO” です。この eos 文字列がクエリ・キャッシュの区切り文字と一致しない場合は、outfile は生成されません。
schemapath オプション — 未修飾テーブル名、ビュー名、またはストアド・プロシージャ名に検索パスを指定するスキーマ名のコンマ区切りのリスト。現在のシステム全体のスキーマの既定である DEFAULT_SCHEMA を含めることができます。infile#Import 指示文が含まれる場合、QOPlanner はこれらの #Import パッケージ/スキーマ名を schemapath の最後に追加します。

以下は、このクエリ最適化プランのリスト・ユーティリティを呼び出す例です。“クエリ・キャッシュ” の章の “クエリ・キャッシュをファイルにリストする” のセクションで説明したように、このユーティリティは、ExportSQL^%qarDDLExport() ユーティリティによって生成されるファイルを入力として受け取ります。このクエリ・リスト・ファイルを生成するか、クエリをテキスト・ファイルに書き込むことができます。

  DO QOPlanner^%apiSQL("C:\temp\test\qcache.txt","C:\temp\test\qoplans.txt","GO")

ターミナルのコマンド行から実行すると、次の例のように進行状況がターミナル画面に表示されます。

Importing SQL Statements from file: C:\temp\test\qcache.txt
 
Recording any errors to principal device and log file: C:\temp\test\qoplans.txt
  
  SQL statement to process (number 1):
      SELECT TOP ? P . Name , E . Name FROM Sample . Person AS P , 
      Sample . Employee AS E ORDER BY E . Name
  Generating query plan...Done
 
  SQL statement to process (number 2):
      SELECT TOP ? P . Name , E . Name FROM %INORDER Sample . Person AS P 
      NATURAL LEFT OUTER JOIN Sample . Employee AS E ORDER BY E . Name
  Generating query plan...Done
 
Elapsed time: .16532 seconds

作成されたクエリ最適化プラン・ファイルには、次のようなエントリが含まれています。

<pln>
<sql>
 SELECT TOP ? P . Name , E . Name FROM Sample . Person AS P , Sample . Employee AS E ORDER BY E . Name
</sql>
Read index map Sample.Employee.NameIDX.
Read index map Sample.Person.NameIDX.
</pln>
######
<pln>
<sql>
 SELECT TOP ? P . Name , E . Name FROM %INORDER Sample . Person AS P 
    NATURAL LEFT OUTER JOIN Sample . Employee AS E ORDER BY E . Name
</sql>
Read master map Sample.Person.IDKEY.
Read extent bitmap Sample.Employee.$Employee.
Read master map Sample.Employee.IDKEY.
Update the temp-file.
Read the temp-file.
Read master map Sample.Employee.IDKEY.
Update the temp-file.
Read the temp-file.
</pln>
######

クエリ最適化プランのテキスト・ファイルを使用して、クエリのさまざまなバリアントを使用して生成される最適化プランを比較したり、Caché のバージョンごとに最適化プランを比較したりできます。

SQL クエリをテキスト・ファイルにエクスポートする場合は、クラス・メソッドまたはクラス・クエリから取得されるクエリは、コード行によって処理されます。

#import <package name>

この #import 文は、クエリ最適化プランナ・ユーティリティがクエリのプラン生成に使用する既定のパッケージ/スキーマを指定します。ルーチンから取得される SQL クエリをエクスポートする場合は、ルーチン・コード内の SQL 文の前にある #import 行もエクスポート・ファイル内の SQL テキストの前に置かれます。クエリ・キャッシュからテキスト・ファイルにエクスポートされるクエリは、完全修飾されたテーブル参照を含むと見なされます。テキスト・ファイル内のテーブル参照が完全修飾でない場合は、クエリ最適化プランナ・ユーティリティを実行するとシステムで定義されている既定のスキーマが使用されます。

クエリの並列処理

オプションの %PARALLEL キーワードは、クエリの FROM 節で指定します。これは、Caché が複数のプロセッサを使用してクエリの並列処理を実行することを示しています (該当する場合)。これにより、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 を指定してクエリを実行すると、全体的なパフォーマンスが低下する可能性があります。

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

無視される %PARALLEL キーワード

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

以下の状況では、%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 は無視されます。

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

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

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

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

サブクエリ内の %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 は、複合述語を含むサブクエリ、または複合述語へと最適化する述語を含むサブクエリに適用された場合は無視されます。複合と見なされる述語には、%CONTAINS、%CONTAINSTERM、FOR SOME、および FOR SOME %ELEMENT 述語があります。

共有メモリの考慮事項

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

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

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

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

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

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

一般メモリ・ヒープまたは gmheap (共有メモリ・ヒープまたは SMH といわれることもある) のサイズを変更するには、管理ポータルのホーム・ページから、[システム管理][構成][追加設定][メモリ詳細] を選択します。詳細は、"Caché 追加構成設定リファレンス" の “Caché 追加構成設定” の章にある "詳細メモリ設定" を参照してください。

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

キャッシュされた SQL クエリが %PARALLEL を使用している場合、このキャッシュされたクエリの実行中にクエリの初期化 (例えば、クエリ・キャッシュの削除) が行われると、このクエリはワーカ・ジョブの 1 つから <NOROUTINE> エラーの報告を受け取る可能性があります。一般に、クエリ・キャッシュの削除は、$SYSTEM.SQL.Purge() を呼び出すか、このクエリが参照するクラスを再コンパイルすることで発生します。クラスを再コンパイルすると、そのクラスに関連するクエリ・キャッシュは自動的に削除されます。

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

SQL 文とプランの状態

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

FeedbackOpens in a new tab