IRISをアップグレードすると、SQLクエリオプティマイザの機能向上により、旧バージョンとは異なるクエリプランによるクエリ実行コード(クエリキャッシュ)が作成される場合があります。
ほとんどの場合はパフォーマンスが向上するのですが、稀にパフォーマンスが低下するケースもあります。
・アップグレードによりオプティマイザが改善しているとはいえ、中には遅くなるクエリがあるのではないか?
・予期しないSQLの問題が起きるのではないか?
・アップグレード後に全てのクエリパターンをテストするには時間と労力がかかりすぎる
このように、機能向上よりも安定性を優先して「今までのプランのまま実行したい」というご要望もあることでしょう。
こちらの記事では、そのようなお客様への解決策をご案内します。
解決策 = 凍結プラン(Frozen Plan)を使用する:
Cache2016.2以降(IRISはすべてのバージョン)で、クエリプランの凍結機能 が実装されました。
この機能により、IRISを新しいバージョンにアップグレードする際、既存のクエリプランは自動的に凍結されます。
これにより、アップグレードによる既存のクエリのパフォーマンスの低下の可能性を防げます(古いバージョンと同じプランが使用されるため)。
新しいクエリについてはもちろん、アップグレード後のクエリオプティマイザによるプランが使用されます。
(凍結プランの)
良い点:クエリパフォーマンスが予測できる(古いバージョンと変わらない)
悪い点:クエリパフォーマンスは向上しない
管理ポータルでクエリプランを確認すると、凍結されたプランは「Frozen Plan」と表示されます。
クエリパフォーマンスの検証方法(新/旧プランのパフォーマンス比較方法):
では、アップグレード後、重要なクエリのパフォーマンスを検証したいときはどうすればよいのでしょうか?
以下に、凍結プラン(旧プラン)と新しいプランのどちらを使用すべきかについて検証する手順をご紹介します。
《手順》
1.対象のプランが「Frozen Plan」である場合、アップグレード前に作成された、最適化されたクエリプランが使用されています(旧プラン使用)。
2.%NOFPLAN キーワードをクエリに追加して実行すると、アップグレード後のクエリオプティマイザを使用して、クエリプランが最適化されます(新プラン使用)。
例:
SELECT %NOFPLAN Name , Age FROM Sample.Person .....
SQLSQL
3.1 と 2 のパフォーマンスを比較します。
1のパフォーマンスが良い場合:
⇒ アップグレードによりクエリプランの効率が低下するため、そのまま凍結プランを使用します。
2のパフォーマンスが良い場合:
⇒ アップグレード後のクエリプランの効率が向上しているため、クエリプランの凍結を解除します。
解除後、ネームスペース内のクエリキャッシュの削除を行います。
クエリプランの凍結解除の方法:
コマンドで行う場合は、ターミナルより以下のように実行します。
// すべてのプランを凍結解除する場合:
set st=$SYSTEM.SQL.Statement.UnfreezeAll()
// 個別に凍結解除する場合:
set st=$SYSTEM.SQL.Statement.UnfreezeSchema("Sample")
または
set st=$SYSTEM.SQL.Statement.UnfreezeRelation("Sample.Person")
または
set st=$SYSTEM.SQL.Statement.UnfreezeStatement("3DgIqc72NS+Np6nybddb719NKb8=") // Statement単位はHash指定
/// Hashは、以下のクエリで確認できます
/// SELECT Hash, Statement FROM INFORMATION_SCHEMA.STATEMENTS WHERE Frozen=1 OR Frozen=2
// 解除後、クエリキャッシュの削除を行う
do $SYSTEM.SQL.PurgeAllNamespaces() // ネームスペース内の全キャッシュ
または
do $SYSTEM.SQL.PurgeForTable("Sample.Person") // テーブル指定
ObjectScriptObjectScript
※既定では、Frozen/Explicit または Frozen/Upgrade とマークされたすべてのクエリプランの凍結を解除します。
詳細はクラスリファレンスを参照してください。
管理ポータルで解除する場合は、[システムエクスプローラ] > [SQL] よりSQLステートメントタブから該当のSQLをクリックします。
[プランを凍結解除] をクリックします。 ※解除後クエリキャッシュを削除します
詳細は以下のドキュメントをご覧ください。
InterSystems SQL 最適化ガイド > 凍結プランの構成