クエリパフォーマンスが出ない場合の対処方法(凍結プランが関係している場合)
これは InterSystems FAQ サイトの記事です。
Caché 2016.2以降(IRISはすべてのバージョン)で、クエリプランの凍結機能 が実装されました。
この機能により、メジャーバージョンのアップグレードを行った場合、既存のクエリプランは自動的に凍結(※)されます。
※2023.1以降のバージョンより、アダプティブモードが無効の場合のみ、クエリプランが自動的に凍結されます。有効の場合は、既存のクエリプランは無効になり、新しいシステムでクエリの最初の実行時に新しい最適化されたクエリプランを生成します。既定は有効です。
こちらのトピックでは、
「新しいバージョンにしたのに、一部のクエリで思うようなパフォーマンスが出ない」
「凍結プランが使用されている場合、新しいプランでパフォーマンスがどのくらいでるのかを知りたい」
という場合の確認手順について、ご説明します。
%NOFPLANキーワードで新しいプランを試してみる
Frozen Plan (古いバージョンと同じプラン)を使用していて思ったようなパフォーマンスが出ない場合、凍結を解除して新しいプランを試すことが可能です。
新しいプランを試したい場合は、%NOFPLANキーワードをつけてクエリを実行します。
%NOFPLANを付けた方がパフォーマンスが良ければ、プラン凍結を解除して新しいプランで実行するようにします。
検証手順は以下のようになります。
1.現在のプランが、凍結プラン(Frozen Plan)と新しいプランのどちらを使用しているかを確認します。
プランの状態は管理ポータルより確認できます。
[システムエクスプローラ] > [SQL] :
確認したいクエリのネームスペースで、テキストボックスに実行したいクエリを書いて「プラン表示」をクリックします。

凍結したプランを使用している場合、上記イメージのように「Frozen Plan」と表示されます。
これはつまり、アップグレード前の凍結されたプランを使用していることを意味します。
Frozen Plan の表記がない場合は、現バージョンの新プランを使用していることを意味します。
プランの状態が「Frozen Plan」の場合、新プランではパフォーマンスがどう変わるかを確認します。
2.%NOFPLAN キーワードをクエリに追加して実行し、パフォーマンスを監視します。
実行例:
SELECT %NOFPLAN Name , Age FROM Sample.Person ....3.新プランの方のパフォーマンスが良ければ、プランの凍結解除を行います。
プラン凍結の解除方法については、以下になります。
// すべてのプランを凍結解除する場合: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") // テーブル指定
【ご参考】