凍結プランの構成
ほとんどの SQL 文には、クエリ・プランが関連付けられています。クエリ・プランは、SQL 文が準備されるときに作成されます。既定で、インデックスの追加やクラスのリコンパイルなどの操作によってこのクエリ・プランは削除されます。次回にクエリが呼び出されたときに、クエリが再準備され、新しいクエリ・プランが作成されます。凍結プランにより、コンパイルの前後で既存のクエリ・プランを維持 (凍結) できます。クエリの実行で、新しい最適化を実行して新しいクエリ・プランを生成するのではなく、凍結プランが使用されるようになります。
システム・ソフトウェアへの変更によって、別のクエリ・プランが作成される場合もあります。通常、こういったアップグレードにより、クエリ・パフォーマンスが向上しますが、ソフトウェアのアップグレードによって特定のクエリのパフォーマンスが低下する場合があります。凍結プランを使用すると、クエリ・プランを維持 (凍結) して、クエリ・パフォーマンスがシステム・ソフトウェアのアップグレードによって変化 (低下または向上) しないようにすることができます。
凍結プランの使用方法
凍結プランの使用方法には、楽観的方法と悲観的方法という 2 つの方法があります。
-
楽観的 : この方法は、システム・ソフトウェアかクラス定義への変更でパフォーマンスが向上することを想定している場合に使用します。クエリを実行して、プランを凍結します。凍結プランをエクスポート (バックアップ) します。プランの凍結を解除します。ソフトウェアの変更を行います。クエリを再実行します。これにより、新しいプランが生成されます。2 つのクエリのパフォーマンスを比較します。新しいプランではパフォーマンスが向上しない場合は、バックアップ・ファイルから以前の凍結プランをインポートします。
-
悲観的 : この方法は、システム・ソフトウェアかクラス定義への変更で、特定のクエリのパフォーマンスが向上する可能性がほとんどないことを想定している場合に使用します。クエリを実行して、プランを凍結します。ソフトウェアの変更を行います。%NOFPLAN キーワードを指定してクエリを再実行します (凍結プランは無視されます)。2 つのクエリのパフォーマンスを比較します。凍結プランを無視してもパフォーマンスが向上しない場合は、プランを凍結したままにして、クエリから %NOFPLAN を削除します。
ソフトウェアのバージョンをアップグレードした後の凍結プラン
InterSystems IRIS® データ・プラットフォームを新しいメジャー・バージョンにアップグレードすると、既定で既存のクエリ・プランは無効になり、新しいシステムでの文の最初の実行時に新しい最適化されたクエリ・プランが生成されます。この新しいクエリ・プランでは、クエリ・オプティマイザ、実行時プラン選択、およびコード生成の改善といった SQL 処理への機能強化が導入されます。この動作は、新しいインストールの既定であるアダプティブ・モードが有効になっているインスタンスのアップグレード時に適用されます。
ただし、アップグレード後に初めてクエリを実行するときにアダプティブ・モードがオフになっている場合、そのクエリは [凍結/アップグレード] とマークされます。そのクエリの以降の呼び出しでも引き続きこのプランが使用されます。この動作によってクエリのパフォーマンスがアップグレード後も同じであることが保証されるため、SQL 処理の強化機能を活用する機会が失われる可能性があるとしても、高度に制御された環境ではこの動作が望ましい場合があります。このようなアップグレードの後には、すぐに手動でクエリ・プランを凍結解除したり、%NOFPLAN を使用してクエリ・プランのパフォーマンスをテストすることができます。以下のステップは、凍結したクエリ・プランのパフォーマンスと、新しいバージョンの InterSystems IRIS によって生成された新しいクエリ・プランのパフォーマンスを比較する方法を示しています。
-
凍結したクエリ・プランを実行して、そのパフォーマンスを監視します。
-
%NOFPLAN キーワードをクエリに追加して実行し、パフォーマンスを監視します。このキーワードにより、ソフトウェアのアップグレードで提供された SQL オプティマイザを使用して、クエリ・プランが最適化されます。既存のクエリ・プランの凍結は解除されません。
-
パフォーマンス・メトリックを比較します。
-
%NOFPLAN のパフォーマンスが優れている場合、ソフトウェアのアップグレードによってクエリ・プランの効率が向上しています。クエリ・プランの凍結を解除します。%NOFPLAN キーワードを削除します。
-
%NOFPLAN のパフォーマンスが劣る場合、ソフトウェアのアップグレードによってクエリ・プランの効率が低下しています。クエリ・プランを凍結状態のままとして、%NOFPLAN キーワードを削除します。
-
-
パフォーマンスが重要なクエリのテストが終了すれば、凍結した残りのプランをすべて凍結解除してもかまいません。
[凍結/アップグレード] とマークされているクエリ・プランは、"凍結プランのインタフェース" で説明しているいずれかのメソッドを使用して [凍結/明示] に昇格できます。一般にこのアップグレードは、維持したい [凍結/アップグレード] プランを選択的に昇格してから、それ以外の [凍結/アップグレード] プランの凍結をすべて解除するために使用します。
ここで説明している動作は、InterSystems 2023.3 以降へのアップグレードに適用されます。これらのバージョンからアップグレードされるインスタンスは、アダプティブ・モードが有効になっています (InterSystems IRIS 2022.2 で導入)。2023.3 より前のリリースへのアップグレードまたは 2022.2 より前のリリースからのアップグレードの場合、アダプティブ・モードはオフと見なされ、前述のようにクエリ・プランの対応する自動凍結が適用されます。
凍結プランのインタフェース
FREEZE PLANS コマンドを使用してクエリを凍結でき、UNFREEZE PLANS コマンドを使用してクエリを凍結解除できます。どちらの操作も、テーブル別、スキーマ別、またはネームスペース別に個別のクエリに対して実行できます。個別のプランを凍結または凍結解除するには、INFORMATION_SCHEMA.STATEMENTS をクエリすることにより、目的の Statement の Hash を探し出します。つづいて、FREEZE PLANS または UNFREEZE PLANS を使用して、特定の文の Hash を指定することで、その文のプランの状態を変更できます。
Frozen プロパティに対して INFORMATION_SCHEMA.STATEMENTS をクエリすることで、現在のネームスペースにあるすべての SQL 文のプランの状態を一覧できます。Frozen 列の値は、凍結解除 (0)、凍結/明示 (1)、凍結/アップグレード (2)、または未凍結/パラレル (3) のいずれかです。特定のクエリに EXPLAIN を使用して、そのクエリが凍結状態であるかどうかを判断することもできます。
1 つ以上のプランの凍結または凍結解除には、$SYSTEM.SQL.Statement Freeze および Unfreeze メソッドを使用することもできます。次の適切なメソッドを指定して、凍結または凍結解除操作の範囲を指定できます : 1 つのプランの場合は FreezeStatement()Opens in a new tab、関係のすべてのプランの場合は FreezeRelation()Opens in a new tab、スキーマのすべてのプランの場合は FreezeSchema()Opens in a new tab、現在のネームスペースのすべてのプランの場合は FreezeAll()Opens in a new tab。対応する Unfreeze メソッドがあります。
特権
ユーザは、INFORMATION.SCHEMA.STATEMENTSOpens in a new tab クラス・クエリなど、自身が EXECUTE 特権を持っている SQL 文のみを表示できます。SQL 文へのカタログ・アクセスの場合は、文を実行する特権が付与されているか、%Development リソースに対する "USE" 特権を持っている場合に文を表示できます。
$SYSTEM.SQL.Statement Freeze または Unfreeze メソッド呼び出しの場合は、%Developer リソースに対する "U" 特権を持っている必要があります。
管理ポータルの [SQL 文] にアクセスするには、%Development リソースに対する "USE" 特権が必要です。管理ポータルで SQL 文を表示できるユーザは、その SQL 文を凍結または凍結解除できます。
凍結プランの相違
プランが凍結されている場合は、実際にプランの凍結を解除することなく、プランの凍結を解除したときに異なるプランが生成されるかどうかを判断できます。この情報は、プランの凍結を解除した場合にパフォーマンスが向上するかどうかを判断するために、%NOFPLAN を使用してテストする価値がある SQL 文を決定する際に役立ちます。
INFORMATION.SCHEMA.STATEMENTSOpens in a new tab FrozenDifferent プロパティを使用して、現在のネームスペースのこのタイプの凍結プランをすべてリスト表示できます。
凍結プランは、以下のいずれかの操作によって現在のプランとは異なるものになる可能性があります。
-
テーブル、またはテーブルが参照するテーブルのリコンパイル。
-
SetMapSelectability()Opens in a new tab を使用したインデックスの有効化または無効化。INFORMATION_SCHEMA.INDEXES カタログ・テーブルをクエリして MAP_SELECTABLE 列の値を確認することで、インデックスがアクティブかどうかを確認できます。
リコンパイルによって、既存のクエリ・キャッシュが自動的に削除されます。その他の操作の場合に新規クエリ・プランを適用するには、既存のクエリ・キャッシュを手動で削除する必要があります。
これらの操作によってクエリ・プランが異なるものになるかどうかはわかりません。すべての凍結プランをスキャンして、新しいクエリ・プランが生成されるかどうかを判断できます。
凍結プランの自動日次チェック
InterSystems SQL は、[SQL 文] リストにある凍結されたすべての文を毎晩午前 2:00 時に自動的にスキャンします。このスキャンは最大で 1 時間かかります。スキャンが 1 時間で完了しなかった場合は、中断した場所が記録され、そこから次回の日時スキャンが続行されます。
さらに、管理ポータルを使用してスキャンを強制実行できます。そのためには、[システムオペレーション]→[タスクマネージャ]→[タスクスケジュール] の順に選択し、Scan frozen plans タスクを選択します。
このスキャンの結果は、INFORMATION.SCHEMA.STATEMENTSOpens in a new tab を呼び出すことで確認できます。以下の例では、すべての凍結プランの SQL 文が返され、凍結されない場合になるプランと凍結プランが異なるかどうかが示されます。未凍結プランの場合の文は Frozen=0 または Frozen=3 となる可能性があることに注意してください。
SELECT Frozen,FrozenDifferent,Timestamp,Statement FROM INFORMATION_SCHEMA.STATEMENTS
WHERE Frozen=1 OR Frozen=2
エラー状態の凍結プラン
文のプランが凍結されているときに、そのプランに使用している定義に何らかの変更を加えることでプランが無効になると、エラーが発生します。例えば、文のプランに使用していたクラスからインデックスが削除されたとします。
-
文のプランは凍結された状態を維持します。
-
[SQL 文の詳細] ページの [コンパイル設定] エリアに、[プラン・エラー] フィールドが表示されます。例えば、クエリ・プランで indxdob というインデックス名が使用されていた場合、インデックス indxdob を削除するようにクラス定義を変更すると、次のようなメッセージが表示されます:Map 'indxdob' not defined in table 'Sample.Mytable', but it was specified in the frozen plan for the query.
-
[SQL 文の詳細] ページの [クエリプラン] エリアには、Plan could not be determined due to an error in the frozen plan と表示されます。
凍結プランがエラー状態の間にクエリが再実行された場合、InterSystems IRIS は凍結プランを使用しません。代わりに、現在の定義で動作する新しいクエリ・プランが作成されて、そのクエリが実行されます。このクエリ・プランには、前のクエリ・プランと同じクエリ・キャッシュ・クラス名が割り当てられます。
エラー状態のプランは、プランの凍結が解除されるか、プランが有効な状態に戻るように定義を変更するまでエラー状態のままになります。
プランが有効な状態に戻るように定義を変更した場合は、[SQL 文の詳細] ページに移動し、[エラーのクリア] ボタンをクリックして、エラーが修正されたかどうかを確認します。修正されている場合は、[プラン・エラー] フィールドが表示されなくなります。それ以外の場合は、[プラン・エラー] のメッセージが再表示されます。定義が修正されている場合は、明示的にプラン・エラーをクリアしなくても、SQL は凍結プランを使用するようになります。定義が修正されている場合は、[エラーのクリア] ボタンにより、[SQL 文の詳細] ページの [凍結クエリ・プラン] エリアに、実行プランが再度表示されます。
[プラン・エラー] は、"ソフト・エラー" の可能性があります。これは、プランがインデックスを使用していて、そのインデックスの選択可能性が SetMapSelectability()Opens in a new tab で 0 に設定されているために、現時点ではクエリ・オプティマイザが選択できない場合に発生することがあります。ほとんどの場合、この原因はインデックスが構築 (再構築) されたことによります。凍結プランがある文に InterSystems IRIS がソフト・エラーを検出すると、クエリ・プロセッサは自動的にエラーをクリアして、凍結プランを使用しようとします。プランがエラー状態のままの場合は、そのプランに再度エラー状態のマークが付けられ、クエリ実行は使用可能な最適なプランを使用するようになります。
%NOFPLAN キーワード
%NOFPLAN キーワードを使用すると、凍結プランをオーバーライドできます。%NOFPLAN キーワードを含んでいる SQL 文は、新しいクエリ・プランを生成します。凍結プランは保持されますが、使用されません。これにより、凍結プランを維持しながら、生成されたプランの動作をテストできるようになります。
%NOFPLAN の構文は、以下のとおりです。
DECLARE <cursor name> CURSOR FOR SELECT %NOFPLAN ... SELECT %NOFPLAN .... INSERT [OR UPDATE] %NOFPLAN ... DELETE %NOFPLAN ... UPDATE %NOFPLAN
SELECT 文では、クエリ内で最初の SELECT の直後にのみ %NOFPLAN キーワードを使用できます。これは、UNION クエリの最初の項にのみ使用可能であり、サブクエリでは使用できません。%NOFPLAN キーワードは、SELECT の直後 (DISTINCT や TOP など、その他のキーワードより前) に配置する必要があります。
凍結プランのエクスポートとインポート
SQL 文を XML 形式のテキスト・ファイルとしてエクスポートまたはインポートすることができます。これにより、凍結プランを別の場所に移動できます。SQL 文のエクスポートとインポートには、関連付けられたクエリ・プランのエンコード・バージョンと、プランが凍結されているかどうかを示すフラグが含まれます。詳細は、"SQL 文のエクスポートとインポート" を参照してください。