21 拡張可能オプティマイザ・インタフェース
拡張可能オプティマイザへのインタフェースを構成するファンクションおよびプロシージャについて説明します。
21.1 拡張可能オプティマイザ・インタフェース
拡張可能オプティマイザ・インタフェースは、パーティション表とドメイン索引での作業をサポートします。これには、次の2つの方法があります。
-
ODCIStats
インタフェース・メソッドのパラメータである一部のシステム定義オブジェクト型には、属性が追加されています。たとえば、ODCIColInfo
型は、列のパーティションに関する情報を追加するように拡張されています。 -
一部の
ODCIStats
メソッドについて、引数またはそのセマンティクスが変更されています。
ODCIStats2
バージョンのODCIStats
インタフェースのコードを、ODCIIndex2
バージョンの拡張可能索引付けインタフェースを実装する索引タイプとともに統計タイプを使用するように更新する必要があることに注意してください。
21.1.2 EXPLAIN PLAN
EXPLAIN
PLAN
には、ドメイン索引に対するユーザー定義のCPUコストとI/OコストがPLAN_TABLE
のCPU_COST
列とIO_COST
列に表示されます。たとえば、表Emp_tab
とユーザー定義演算子Contains
があるとします。さらに、Emp_tab
のResume_col
列にドメイン索引EmpResume_indx
があり、EmpResume_indx
の索引タイプで演算子Contains
がサポートされているとします。次の問合せを考えてみます。
SELECT * FROM Emp_tab WHERE Contains(Resume_col, 'Oracle') = 1
この問合せに次の計画があるとします。
OPERATION | OPTIONS | OBJECT_NAME | CPU_COST | IO_COST |
---|---|---|---|---|
SELECT STATEMENT |
||||
TABLE ACCESS |
BY ROWID |
EMP_TAB |
||
DOMAIN INDEX |
EMPRESUME_INDX |
300 |
4 |
21.1.3 INDEXヒント
INDEXヒントは、ドメイン索引に適用されます。つまり、INDEXヒントにより、オプティマイザではユーザー定義演算子に強制的にヒント付き索引が使用されます(可能な場合)。
21.2 ユーザー定義ODCIStatsファンクション
ユーザー定義のODCIStats
ファンクションは、表列、ファンクション、パッケージ、型、索引タイプまたはドメイン索引に使用されます。
表21-1 ユーザー定義ODCIStatsファンクションの概要
ファンクション | 説明 |
---|---|
ユーザーが実装した |
|
|
|
表、表のパーティション、索引または索引のパーティションのユーザー定義統計を削除します。 |
|
ファンクションのコストを計算します。 |
|
|
|
ドメイン索引スキャンのコストを計算します。 |
|
述語の選択性を指定します。 |
|
テーブル・ファンクションと入力カーソル式のカーディナリティ統計を提供します。 |
|
パーティション・メンテナンス操作中に統計を更新します。ドメイン索引の統計にパッチを適用します。 |
21.2.1 ODCIGetInterfaces()
ODCIGetInterfaces
はサーバーによりコールされ、ユーザー定義統計タイプのメソッドにユーザーにより実装されたODCIStats
インタフェースのバージョンを検出します。
構文
FUNCTION ODCIGetInterfaces( ifclist OUT ODCIObjectList) RETURN NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
ifclist |
OUT |
統計タイプにより実装された |
戻り値
正常終了した場合はODCIConst.Success
、それ以外の場合はODCIConst.Error
。
21.2.2 ODCIStatsCollect()
DBMS_STATS
パッケージによりコールされ、ユーザー定義統計を収集します。
構文 | 説明 |
---|---|
FUNCTION ODCIStatsCollect( col ODCIColInfo, options ODCIStatsOptions, statistics OUT RAW, env ODCIEnv) return NUMBER; |
|
FUNCTION ODCIStatsCollect( ia ODCIIndexInfo, options ODCIStatsOptions, statistics OUT RAW, env ODCIEnv) return NUMBER; |
索引または索引のパーティションのユーザー定義統計を収集するためにコールされます。 |
パラメータ | IN/OUT | 説明 |
---|---|---|
|
統計の収集対象の列 |
|
|
|
|
|
収集されたユーザー定義統計 |
|
env |
ルーチンの実行環境に関する一般情報が含まれます。 |
|
|
統計の収集対象のドメイン索引。 |
戻り値
このファンクションは、ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
を戻します。
使用方法
-
このファンクションは、
STATIC
型のメソッドとして実装する必要があります。 -
統計を収集するパーティションが1つのみの場合は、
ODCIColInfo
型のTablePartition
フィールドにパーティション名が入力されます。それ以外の場合(全パーティションまたは表全体の統計を収集する必要がある場合)、TablePartition
フィールドはNULLです。 -
パーティション表のユーザー定義統計を収集するために
DBMS_STATS
パッケージのメソッドが実行されると、ODCIStatsCollect
がn+1
回コールされます (n
は表のパーティション数)。最初のn
回のコールでは、ODCIColInfo
のTablePartition
属性にパーティション名が入力され、ODCIStatsOptions.CallProperty
がIntermediateCall
に設定されます。最後のコールでは、表全体の集計統計を収集できるようにODCIEnv.CallPropertyflag
がFinalCall
に設定されます。 -
ユーザー定義統計が収集される表パーティションが1つのみの場合、
ODCIStatsCollect
が2回コールされます。最初のコールでは、パーティションの統計を収集する必要があります。このコールの場合、ODCIColInfo
構造のTablePartition
属性が入力され、ODCIEnv.CallProperty
がFirstCall
に設定されます。 -
第2のコールでは、パーティションについて収集した新規統計に基づいて、表の集計統計を更新できます。このコールでは、
ODCIEnv.CallPropertyflag
が第2コールを示すFinalCall
に設定されます。ODCIColInfo.TablePartition
には、両方のコールでパーティション名が入力されます。 -
ODCIStatsCollect()メソッドは、非パーティション・ドメイン索引、パーティション・ドメイン索引およびドメイン索引のパーティションに対して1回のみ起動されます。統計を収集するパーティションが1つのみの場合は、
ODCIIndexInfo
型のIndexPartitionNum
フィールドにパーティション名が入力されます。それ以外の場合、IndexPartitionNum
フィールドはNULL
です。 -
統計の
OUT RAW
引数は新規のインタフェースでは使用されないため、カートリッジ開発者はユーザー定義の統計結果をユーザー定義表に格納する必要があります。 -
非パーティション・ドメイン索引が
ANALYZE
で指定されている場合、ユーザーはドメイン索引に対して統計を収集する必要があります。 -
パーティション・ドメイン索引が
ANALYZE
で指定されている場合、次のようになります。-
ODCIEnv.CallProperty = StatsGlobalAndPartition
は、ユーザーがドメイン索引内のすべてのパーティションの統計を収集し、すべてのパーティションで収集された統計に基づいてドメイン索引の統計を収集する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsGlobal
は、ユーザーがすべてのドメイン索引パーティションの統計からドメイン索引統計を集計する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsPartition
は、ユーザーがドメイン索引内のすべての索引パーティションの統計を収集する必要があることを意味します。
-
-
1つのパーティション・ドメイン索引のみが
ANALYZE
で指定されている場合、次のようになります。-
ODCIEnv.CallProperty = StatsGlobalAndPartition
は、ユーザーが単一索引パーティションの統計を収集し、すべてのパーティションの統計に基づいてドメイン索引を集計する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsGlobal
は、ユーザーがすべてのドメイン索引パーティションの統計からドメイン索引統計を集計する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsPartition
は、ユーザーが単一索引パーティションの統計を収集する必要があることを意味します。
-
-
ODCIEnv.CallProperty = StatsGlobalAndPartition
またはStatsGlobal
である場合、他の索引パーティションに対して収集された統計の可用性に応じて、ドメイン索引の統計を集計する必要があることに注意してください。すべての索引パーティションに対する統計が使用可能である場合、これらの統計を集計します。索引パーティションの統計がない場合は何もしないでください。
21.2.3 ODCIStatsDelete()
ODCIStatsDelete
はユーザー定義統計を削除するためにコールされます。
構文 | 説明 |
---|---|
FUNCTION ODCIStatsDelete( col ODCIColInfo, statistics OUT RAW, env ODCIEnv) return NUMBER; |
表または表のパーティションのユーザー定義統計を削除します。 |
FUNCTION ODCIStatsDelete( ia ODCIIndexInfo, statistics OUT RAW, env ODCIEnv) return NUMBER; |
索引または索引のパーティションのユーザー定義統計を削除します。 |
パラメータ | IN/OUT | 説明 |
---|---|---|
|
統計の削除対象の列。 |
|
|
OUT |
パーティション表または索引の表レベル集計統計が含まれます。 |
|
ルーチンの実行環境に関する一般情報が含まれます。 |
|
|
統計の削除対象のドメイン索引。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
使用方法
-
このファンクションは、
STATIC
メソッドとして実装する必要があります。 -
このファンクションが非パーティション表に対してコールされる場合、
ODCIStatsDelete
インタフェースのstatistics
引数は無視されます。 -
パーティション表の統計が削除される場合、
ODCIStatsDelete
はn+1
回コールされます。最初のn
回のコールでは、ODCIColInfo
構造にパーティション名が入力され、ODCIEnv.CallProperty
がIntermediateCall
に設定されます。最後のコールでは、ODCIEnv.CallProperty
がFinalCall
に設定されます。 -
最初のコールでは、特定のパーティションの統計が削除され、最後のコールでは削除された表の統計を保持するために作成された構造を削除またはクリーン・アップします。最後のコールで
ODCIColInfo.TablePartition
がNULLに設定されます。最初のコールでTablePartition
フィールドに入力されます。 -
統計の削除対象となるパーティションが1つのみで、
_minimal_stats_aggregation
パラメータがFALSE
に設定されている場合は、ODCIStatsDelete
が2回コールされます。各コールでは、ODCIColInfo.TablePartition
にパーティション名が入力されます。最初のコールでは、そのパーティションについて収集されたユーザー定義統計を削除します。2番目のコールでは、表の集計統計を更新します。 -
統計の削除対象となるパーティションが1つで、
_minimal_stats_aggregation
がTRUE
に設定されている場合、ODCIStatsDelete
は1回のみコールされ、そのパーティションに対して収集されたユーザー定義統計を削除します。 -
_minimal_stats_aggregation
の初期値はTRUE
です。 -
ODCIStatsDelete()メソッドは、非パーティション・ドメイン索引、パーティション・ドメイン索引または索引パーティションに対して1回のみ起動されます。
-
非パーティション・ドメイン索引の統計が削除される場合、ドメイン索引のユーザー定義統計を削除する必要があります。
-
パーティション・ドメイン索引の統計が削除される場合、ユーザーは、
ODCIEnv.CallProperty
のオプションに応じて、集計されたドメイン索引の統計を削除し、オプションですべてのドメイン索引パーティションのユーザー定義の統計を削除する必要があります。
-
ODCIEnv.CallProperty = StatsGlobalAndPartition
は、ユーザーがすべてのドメイン索引パーティションの統計、および集計されたドメイン索引の統計を削除する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsGlobal
は、ユーザーが集計されたドメイン索引の統計を削除する必要があることを意味します。 -
ODCIEnv.CallProperty = StatsPartition
は有効なオプションではありません。
-
-
削除される索引パーティションの統計が1つのみである場合、索引パーティションのユーザー定義統計を削除する必要があります。
21.2.4 ODCIStatsFunctionCost()
ファンクションのコストを計算します。
構文
FUNCTION ODCIStatsFunctionCost(
func ODCIFuncInfo,
cost OUT ODCICost,
args ODCIArgDescList,
list,
env ODCIEnv)
return NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
|
コストを計算するファンクションまたは型のメソッド。 |
|
|
OUT |
計算されたコスト(必ず正の整数)。 |
args |
ファンクションまたは型のメソッドのコールに使用された実引数の説明。ファンクションにn個の引数がある場合、 |
|
|
|
ファンクションまたは型メソッドの実パラメータのリスト。各引数の番号、位置および型は、ファンクションまたは型メソッドと同じである必要があります。 |
env |
ルーチンの実行環境に関する一般情報が含まれます。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
使用方法
このファンクションは、静的な型のメソッドとして実装する必要があります。
21.2.5 ODCIStatsExchangePartition()
ALTER TABLE EXCHANGE PARTITION ... INCLULDING INDEXES
コマンドの発行時にドメイン索引の統計を交換します。
構文
FUNCTION ODCIStatsExchangePartition( ia ODCIIndexInfo, ia1 ODCIIndexInfo, env ODCIEnv) return NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
|
交換が必要な索引パーティションに関する情報 |
|
|
パーティションが交換された非パーティション表の索引に関する情報 |
|
env |
|
ルーチンの実行環境に関する一般情報が含まれます。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
使用方法
-
このメソッドは、
STATIC
型として実装する必要があります。 -
このメソッドにより、非パーティション・ドメイン索引に関連付けられた統計にドメイン索引パーティションに関連付けられた統計を変換でき、またその逆も可能です。索引または索引パーティションの1つが欠落している統計の場合、その統計を削除できます。
21.2.6 ODCIStatsIndexCost()
ドメイン索引スキャンのコストを計算します。索引全体のスキャンまたは1つ以上の索引パーティションのスキャン(ローカル・ドメイン索引を作成済の場合)について計算されます。
構文
FUNCTION ODCIStatsIndexCost( ia ODCIIndexInfo, sel NUMBER, cost OUT ODCICost, qi ODCIQueryInfo, pred ODCIPredInfo, args ODCIArgDescList, start operator_return_type, stop operator_return_type, list, env ODCIEnv) return NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
|
統計の収集対象のドメイン索引。 |
|
|
ユーザー計算による述語の選択性。 |
|
|
計算されたコスト(必ず正の整数)。 |
|
|
|
問合せに関する情報。 |
pred |
|
述語に関する情報。 |
args |
|
演算子のコールに使用された |
start |
|
演算子の下限(たとえば、述語 |
stop |
|
演算子の上限(述語 |
|
|
演算子の実パラメータ(2番目以降)のリスト。各引数の番号、位置および型は、演算子と同じである必要があります。 |
env |
|
ルーチンの実行環境に関する一般情報が含まれます。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
使用方法
-
オプティマイザは、問合せに含まれる表ごとに、パーティション・プルーニングを使用してアクセス可能なパーティションの範囲を判別します。これらのパーティションは興味のある(関連)パーティションと呼ばれます。表の対象パーティションのセットは、その表のすべてのドメイン索引の興味のあるパーティションでもあります。ドメイン索引のコストは対象パーティションのセットによって決まるため、オプティマイザは、列である引数については、興味のある索引パーティションのリストを
args
引数でODCIStatsIndexCost
に渡します(この引数の型であるODCIArgDescList
は、ODCIArgDesc
引数のディスクリプタの型のリストです)。非パーティション・ドメイン索引の場合やパーティション・プルーニングが不可能な場合は、パーティション・リストがODCIStatsIndexCost
に渡されないため、索引全体がアクセスされるものとみなす必要があります。 -
ドメイン索引キーには、複数列の引数(たとえば、結合順序で先に指定されている他の表の索引付けされた列および列引数など)を含めることができます。
args
引数には、索引キーに示される列ごとに表について興味のあるパーティションのリストが含まれます。たとえば、次の索引キーを考えてみます。op(T1.c1, T2.c2) = 1
この場合、表
T1
およびT2
がパーティション化されていて、そのパーティション・プルーニングが存在していれば、オプティマイザは2つの表について興味のあるパーティションのリストを渡します。 -
このファンクションは、静的な型のメソッドとして実装する必要があります。
-
パーティション表または非パーティション表の問合せに対して、
ODCIStatsIndexCost()
ファンクションが1回のみコールされます。パーティション表の問合せの場合は、ODCIStatsIndexCost()
ファンクションで追加情報が渡されます。ODCIStatsIndexCost()
に渡されたリスト内の一部のパーティションは、実際には問合せでアクセスできない場合があることに注意してください。興味のあるパーティションのリストは、特にアクセスされないことが確実なパーティションを除外するためのものです。 -
ODCIStatsIndexCost()
ファンクションのコール時に、ユーザーはコスト属性のIndexCostInfo
フィールドに文字列を入力して、有効な追加情報を提供できます。実行計画によりドメイン索引スキャンが選択されると、EXPLAIN PLAN
出力のOPTIONS
列に文字列(最大255文字)が表示されます。 -
このファンクションを実装するユーザーは、
ODCIGetInterfaces()
コールで'SYS.ODCISTATS2'
を戻す必要があります。
21.2.7 ODCIStatsSelectivity()
述語の選択性を指定します。1つの表の列が関係する述語の選択性は、その表における述語を満たす行の割合です。複数の表の列が関係する述語(結合述語など)の場合は、選択性を各表のデカルト積における行の割合として計算する必要があります。
構文
FUNCTION ODCIStatsSelectivity( pred ODCIPredInfo, sel OUT NUMBER, args ODCIArgDescList, start function_return_type, stop function_return_type, list, env ODCIEnv) return NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
|
選択性の計算対象の述語。 |
|
|
計算された選択性。パーセンテージを表す0から100の数値で表されます。 0より小さい数値または100より大きい数値は無効な値として無視されます。計算された選択性が0.5%未満の場合は、値が0が出力パラメータ |
|
|
ファンクション、型メソッドまたは演算子のコールに使用された |
|
|
|
ファンクションの下限(たとえば、述語 |
|
|
ファンクションの上限(述語 |
|
|
ファンクションまたは型メソッドの実パラメータのリスト。各引数の番号、位置および型は、ファンクション、型メソッドまたは演算子と同じである必要があります。 |
|
|
ルーチンの実行環境に関する一般情報が含まれます。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
使用方法
-
ODCIStatsIndexCost
の場合と同様に、args引数には、選択性の計算が必要な述語で列が参照される表の対象パーティションのリストが含まれます。これらの興味のあるパーティションは、パーティション・プルーニングでアクセス可能な候補として排除できないパーティションです。興味のあるパーティションのセットがファンクションに渡されるのは、パーティション・プルーニングが発生した場合(つまり、興味のあるパーティションが全パーティションの厳密なサブセットである場合)のみです。 -
たとえば、述語の選択性を計算するために
ODCIStatsSelectivity
がコールされるとします。f(T1.c1, T2.c2) > 4
この場合、パーティション・プルーニングが可能であれば、オプティマイザは表
T1
について興味のあるパーティションのリストを(列T1.c1
の引数のディスクリプタで)渡します。表T2
の場合も同様です。述語に複数の表の列が含まれている場合は、この情報が
pred
引数のFlags
属性に設定されたフラグ・ビットPredMultiTable
で示されます。 -
このファンクションは、静的な型のメソッドとして実装する必要があります。
-
このインタフェースを実装するユーザーは、
ODCIGetInterfaces
コールで'SYS.ODCISTATS2'
を戻す必要があります。 -
1つの表の列が関係する述語の選択性は、その表における述語を満たす行の割合です。複数の表の列が関係する述語(結合述語など)の場合は、選択性を各表のデカルト積における行の割合として計算する必要があります。パーティション・プルーニングを使用する表の場合は、関係する表の興味のあるパーティションのカーディナリティを基準にした選択性を表す必要があります。
パーティション表の列が関係する述語の選択性は、興味のあるパーティションの行を基準にして計算されます。次の述語の選択性を考えてみます。
g(T1.c1) < 5
この選択性は、この述語を満たす興味のあるパーティションのセット(または、パーティション・プルーニングが不可能な場合はすべてのパーティション)に含まれる行のパーセンテージです。複数の表の列が関係する述語の場合、選択性は各表のデカルト積に含まれる行数を基準とする必要があります。
-
たとえば、次の述語を考えてみます。
f(T1.c1, T2.c2) > 4
興味のあるパーティションの行数が、
T1
の場合は1000、T2
の場合は5000であるとします。この述語の選択性は、T1
およびT2
のデカルト積のうち述語を満たす5,000,000行のパーセンテージとして表す必要があります。 -
述語に複数の表の列が含まれている場合は、この情報が
pred
引数のFlags
属性に設定されたフラグ・ビットPredMultiTable
で示されます。 -
単一表の述語または結合順序の前の方にある他の結合に基づいて表のカーディナリティ(および他の統計)が減らされている場合、関係する表のベース・カーディナリティを基準として表される選択性は、実際の選択性の概算にすぎない可能性があります。ただし、ほとんどのアプリケーションでは、実際の選択性に対するこのような概算は許容可能です。
-
パーティション表または非パーティション表の問合せに対して、
ODCIStatsSelectivity
ファンクションが1回のみコールされます。パーティション表の問合せの場合は、ODCIStatsSelectivity
ファンクションのコール時に追加情報が渡されます。
21.2.8 ODCIStatsTableFunction()
このファンクションは、テーブル・ファンクションと入力カーソル式のカーディナリティ統計を提供します。
構文
STATIC FUNCTION ODCIStatsTableFunction(
func IN SYS.ODCIFuncInfo,
outStats OUT SYS.ODCITabFuncStats,
argDesc IN SYS.ODCIArgDescList,
list)
RETURN NUMBER;
パラメータ | IN/OUT | 説明 |
---|---|---|
|
テーブル・ファンクション名。 |
|
|
戻されると思われる行数。 |
|
|
テーブル・ファンクションの引数の説明。 |
|
|
|
引数のコンパイル時の値。実行時にのみ値を持つ式は、NULLで表されます。 |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
21.2.9 ODCIStatsUpdPartStatistics()
パーティション・メンテナンス操作中に統計を更新します。これにより、統計タイプはドメイン索引統計を修正して、パーティション・メンテナンス操作を適切に反映します。
構文
STATIC FUNCTION ODCIStatsCollect( ia ODCIIndexInfo, palist ODCIPartInfoList, env ODCIEnv) RETURN NUMBER
パラメータ | IN/OUT | 説明 |
---|---|---|
|
ドメイン索引に関する情報が含まれます。パーティションの特定情報は含まれません。 |
|
palist |
削除または追加されるパーティションに関する情報が含まれます。 |
|
env |
|
ルーチンに渡される環境ハンドル |
戻り値
ODCIConst.Success
、ODCIConst.Error
またはODCIConst.Warning
。
-
SYSTEM MANAGED
アプローチで統計タイプが指定される場合は、ODCIStatsUpdPartStatistics()メソッドがPMO時に1回のみ起動されます。メソッド実装ではDMLおよび問合せのみが許可されます。 -
グローバル非パーティション表のドメイン索引統計をメンテナンスする場合、削除したパーティションのユーザー定義統計のエントリを削除する必要があります(またはオプションで、追加パーティションに
NULL
エントリを追加します)。ODCIEnv.CallProperty
がStatsGlobalAndPartition
またはStatsPartition
である場合は、チェック可能です。ODCIEnv.CallProperty
がStatsGlobalAndPartition
である場合、使用可能なすべての索引パーティションの統計を集計する必要があります。ODCIEnv.CallProperty
がStatsPartition
の場合、集計統計を単に削除するか、そのままにしておくことも可能です。ODCIEnv.CallProperty
はこのコールに対してStatsGlobal
になりません。 -
ユーザーは
ODCIEnv.CallProperty
によって渡された情報を使用して、削除および調整する統計タイプを決定する必要があります。 -
メソッドが
ODCIConst.Error
に戻ると、エラーは無視されパーティション管理作業が継続されます。