実行時プラン選択の使用法
実行時プラン選択 (RTPC) は、SQL オプティマイザが実行時 (クエリの実行時) に異常値情報を利用できるようにするための構成オプションです。アダプティブ・モードが有効であれば RTPC が有効になりますが、アダプティブ・モードを無効にしていても RTPC を有効にすることはできます。
RTPC が有効である場合、クエリ作成では、異常値があるフィールドに関する条件がクエリで指定されているかどうかが検出されます。異常値フィールドの条件が 1 つ以上検出されると、クエリはオプティマイザに送信されず、実行時プラン選択スタブが生成されます。実行時に、オプティマイザはこのスタブを使用して、実行するクエリ・プランを選択します。このプランは、異常値ステータスを無視する標準クエリ・プランまたは異常値ステータスに対して最適化された代替クエリ・プランです。異常値条件が複数ある場合、オプティマイザは、複数の代替実行時クエリ・プランからいずれかを選択できます。
RTPC クエリ・プランの表示は、SQL コードのソースによって異なります。
-
管理ポータルの SQL インタフェースにある [プラン表示] ボタンには、代替の実行時クエリ・プランが表示されることがあります。この [プラン表示] の SQL コードが SQL インタフェースのテキスト・ボックスから取得されるからです。
-
文にすべてのパラメータの値が指定されている場合、返されるプランでは RTPC を使用した最適なプランの準備でそれらの値が考慮されます。ただし、プレースホルダとして ? が指定されたパラメータがある場合、パラメータ値を使用せず、テキスト "Different parameters may use a different plan" が含まれるプランが返されます。
-
RTPC が有効でない場合、または該当する異常値フィールド条件がクエリに含まれていない場合、オプティマイザは、標準 SQL 文および対応するクエリ・キャッシュを作成します。
-
RTPC スタブが凍結されている場合、関連付けられている代替実行時クエリ・プランもすべて凍結されます。RTPC 構成オプションがオフになっていても、RTPC 処理は凍結されたクエリに対して有効のままです。
-
SELECT Name,HaveContactInfo FROM t1 WHERE HaveContactInfo=(('Yes')) のように、括弧を指定すると、クエリを記述する際に手動でリテラル置換を抑制できます。条件で異常値フィールドのリテラル置換を抑制した場合、そのクエリには RTPC は適用されません。この場合は、リテラル変換を指定した標準のクエリ・キャッシュがオプティマイザによって作成されます。
RTPC の適用
SELECT 文と CALL 文の場合は、テーブル・チューニングによって異常値があると判断されたフィールドが、そのフィールドをリテラルと比較する条件で指定されていれば、そのようなすべてのフィールドに RTPC が適用されます。その比較条件は以下のいずれかです。
RTPC が適用された場合、オプティマイザは、標準クエリ・プランと代替クエリ・プランのどちらを適用するかを実行時に決定します。
RTPC は、INSERT、UPDATE、DELETE の各文には適用されず、以下の場合も適用されません。
-
クエリに未解決の ? 入力パラメータがある場合。
-
二重括弧で囲まれたリテラル値がクエリで指定され、リテラル置換が抑制されている場合。
-
異常値フィールド条件が設定されていないサブクエリによって、異常値フィールド条件に対してリテラルが指定されている場合。
RTPC のオーバーライドまたは無効化
%NORUNTIME 制約キーワードを指定することにより、特定のクエリについて RTPC をオーバーライドできます。SELECT Name,HaveContactInfo FROM t1 WHERE HaveContactInfo=? というクエリが RTPC で処理される場合、SELECT %NORUNTIME Name,HaveContactInfo FROM t1 WHERE HaveContactInfo=? というクエリによって RTPC がオーバーライドされ、標準クエリ・プランになります。
アダプティブ・モードが無効であれば、$SYSTEM.SQL.Util.SetOption()Opens in a new tab メソッドを SET status=$SYSTEM.SQL.Util.SetOption("RTPC",flag,.oldval) のように使用すると、システム全体ですべてのプロセスに対して RTPC を有効または無効にすることができます。flag 引数は、RTPC を設定 (1) または設定解除 (0) するために使用するブーリアン値です。oldvalue 引数は、前の RTPC 設定をブーリアン値として返します。
現在の設定を確認するには、$SYSTEM.SQL.CurrentSettings()Opens in a new tab を呼び出します。