21 拡張可能オプティマイザ・インタフェース

拡張可能オプティマイザへのインタフェースを構成するファンクションおよびプロシージャについて考えます。

21.1 拡張可能オプティマイザ・インタフェース

拡張可能オプティマイザ・インタフェースは、パーティション表とドメイン索引での作業をサポートします。これには、次の2つの方法があります。

  • ODCIStatsインタフェース・メソッドのパラメータである一部のシステム定義オブジェクト型に、属性が追加されています。たとえば、ODCIColInfo型は、列のパーティションに関する情報を追加するように拡張されています。

  • 一部のODCIStatsメソッドについて、引数またはそのセマンティクスが変更されています。

ODCIStats2バージョンのODCIStatsインタフェースのコードを、ODCIIndex2バージョンの拡張可能索引付けインタフェースを実装する索引タイプとともに統計タイプを使用するように更新する必要があることに注意してください。

21.1.1 拡張可能オプティマイザ・インタフェースでの統計ファンクションの使用

統計ファンクションの使用例を考えてみます。

  1. HRスキーマ内で次の演算子を定義します。
    CREATE OPERATOR Contains binding (VARCHAR2(4000), VARCHAR2(30))
       RETURN NUMBER USING Contains_fn;
    
    CREATE TYPE stat1 (
       ...,
       STATIC FUNCTION ODCIStatsSelectivity(pred ODCIPredInfo, sel OUT NUMBER,
          args ODCIArgDescList, start NUMBER, stop NUMBER, doc VARCHAR2(4000),
          key VARCHAR2(30)) return NUMBER,
       STACTIC FUNCTION ODCIStatsFunctionCost(func ODCIFuncInfo, cost OUT
          ODCICost, args ODCIArgDescList, doc VARCHAR2(4000), key VARCHAR2(30))
          return NUMBER,
       STATIC FUNCTION ODCIStatsIndexCost(ia ODCIIndexInfo, sel NUMBER,
          cost OUT ODCICost, qi ODCIQueryInfo, pred ODCIPredInfo,
          args ODCIArgDescList, start NUMBER, stop NUMBER,
          key VARCHAR2(30)) return NUMBER,
       ...
    );
    
    CREATE TABLE T (resume VARCHAR2(4000));
    
    CREATE INDEX T_resume on T(resume) INDEXTYPE IS indtype;
    
    ASSOCIATE STATISTICS WITH FUNCTIONS Contains_fn USING stat1;
    
    ASSOCIATE STATISTICS WITH INDEXTYPE indtype USING stat1 
       WITH SYSTEM MANAGED STORAGE TABLES;
    
  2. オプティマイザで次の問合せが検出されるとします。
    SELECT * FROM T WHERE Contains(resume, 'ORACLE') = 1,
    
  3. Contains演算子のファンクション実装に対してユーザー定義の選択性ファンクションがコールされ、述語の選択性が計算されます。この場合、選択性ファンクションはstat1.ODCIStatsSelectivityです。これは次のようにコールされます。
    stat1.ODCIStatsSelectivity (
       ODCIPredInfo('HR', 'Contains_fn', NULL, 29),
       sel,
       ODCIArgDescList(
          ODCIArgDesc(ODCIConst.ArgLit,
                      NULL, NULL, NULL, NULL, NULL, NULL),
          ODCIArgDesc(ODCIConst.ArgLit,
                      NULL, NULL, NULL, NULL, NULL, NULL),
          ODCIArgDesc(ODCIConst.ArgCol, 'T', 'HR', '"RESUME"', NULL, NULL, NULL),
          ODCIArgDesc(ODCIConst.ArgLit,
                      NULL, NULL, NULL, NULL, NULL, NULL)),
          1,
          1,
          NULL,
          'ORACLE')
    
  4. 選択性ファンクションが選択性3(パーセント)を戻すとします。ドメイン索引の評価時に、オプティマイザはユーザー定義の索引コスト・ファンクションを次のようにコールします。
    stat1.ODCIStatsIndexCost (   ODCIIndexInfo('HR', 'T_RESUME',      ODCIColInfoList(ODCIColInfo('HR', 'T', '"RESUME"', NULL, NULL, NULL, 0, 0, 0, 0)), NULL, 0, 0, 0, 0),      3,      cost,      NULL,      ODCIPredInfo('HR', 'Contains', NULL, 13),      ODCIArgDescList( ODCIArgDesc(ODCIConst.ArgLit,                                   NULL, NULL, NULL, NULL, NULL, NULL),                       ODCIArgDesc(ODCIConst.ArgLit,                                   NULL, NULL, NULL, NULL, NULL, NULL),                       ODCIArgDesc(ODCIConst.ArgLit,                                   NULL, NULL, NULL, NULL, NULL, NULL)),      1,      1,      'ORACLE')
    
  5. オプティマイザが、コストが大きすぎるためドメイン索引を使用しないように決定したとします。そこで次のように、演算子のファンクション実装に対してユーザー定義のコスト・ファンクションをコールします。
    stat1.ODCIStatsFunctionCost (
       ODCIFuncInfo('HR', 'Contains_fn', NULL, 1),
       cost,
       ODCIArgDescList(  ODCIArgDesc(ODCIConst.ArgCol, 
                           'T', 'HR', '"RESUME"', NULL, NULL, NULL),
                         ODCIArgDesc(ODCIConst.ArgLit, 
                            NULL, NULL, NULL, NULL, NULL, NULL)),
       NULL,
       'ORACLE')
    

21.1.2 EXPLAIN PLAN

EXPLAIN PLANでは、ドメイン索引に対するユーザー定義のCPUおよびI/OコストがPLAN_TABLECPU_COST列とIO_COST列に表示されます。たとえば、表Emp_tabとユーザー定義演算子Containsがあるとします。さらに、Emp_tabResume_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.1.4 ORDERED_PREDICATESヒント

ORDERED_PREDICATESヒントにより、オプティマイザでは、SQL DML文のWHERE句に指定された条件(索引キーに使用される条件以外)の評価順序が強制的に保たれます。

21.2 ユーザー定義ODCIStatsファンクション

ユーザー定義のODCIStatsファンクションは、表列、ファンクション、パッケージ、型、索引タイプまたはドメイン索引に使用されます。

表21-1 ユーザー定義ODCIStatsファンクションの概要

ファンクション 説明

ODCIGetInterfaces()

ユーザーが実装したODCIStatsインタフェースのバージョンを検出します。

ODCIStatsCollect()

DBMS_STATSパッケージによりコールされ、表、表のパーティション、索引または索引のパーティションにユーザー定義の統計を収集します。

ODCIStatsDelete()

表、表のパーティション、索引または索引のパーティションのユーザー定義統計を削除します。

ODCIStatsFunctionCost()

ファンクションのコストを計算します。

ODCIStatsExchangePartition()

ALTER TABLE EXCHANGE PARTITION ... INCLULDING INDEXESコマンドの発行時にドメイン索引の統計を交換します。

ODCIStatsIndexCost()

ドメイン索引スキャンのコストを計算します。

ODCIStatsSelectivity()

述語の選択性を指定します。

ODCIStatsTableFunction()

テーブル・ファンクションと入力カーソル式のカーディナリティ統計を提供します。

ODCIStatsUpdPartStatistics()

パーティション・メンテナンス操作中に統計を更新します。ドメイン索引の統計にパッチを適用します。

21.2.1 ODCIGetInterfaces()

ODCIGetInterfacesはサーバーによりコールされ、ユーザー定義統計タイプのメソッドにユーザーにより実装されたODCIStatsインタフェースのバージョンを検出します。

構文

FUNCTION ODCIGetInterfaces(
   ifclist OUT ODCIObjectList)
RETURN NUMBER;
パラメータ IN/OUT 説明
ifclist
OUT

統計タイプにより実装されたODCIStatsインタフェースのバージョン。この値はSYS.ODCISTATS2である必要があります。

戻り値

正常終了した場合はODCIConst.Success、それ以外の場合はODCIConst.Error

21.2.2 ODCIStatsCollect()

DBMS_STATSパッケージによりコールされ、ユーザー定義統計を収集します。

構文 説明
FUNCTION ODCIStatsCollect(
   col ODCIColInfo, 
   options ODCIStatsOptions, 
   statistics OUT RAW,
   env ODCIEnv) 
return NUMBER;

DBMS_STATSパッケージによりコールされ、表または表のパーティションのユーザー定義統計を収集します。

FUNCTION ODCIStatsCollect(
   ia ODCIIndexInfo, 
   options ODCIStatsOptions, 
   statistics OUT RAW,
   env ODCIEnv)
 return NUMBER;

索引または索引のパーティションのユーザー定義統計を収集するためにコールされます。

パラメータ IN/OUT 説明

col

統計の収集対象の列

options

DBMS_STATSに渡されたオプション

statistics

収集されたユーザー定義統計

env

ルーチンの実行環境に関する一般情報が含まれます。

ia

統計の収集対象のドメイン索引。

戻り値

このファンクションは、ODCIConst.SuccessODCIConst.ErrorまたはODCIConst.Warningを戻します。

使用上の注意

  • このファンクションは、STATIC型のメソッドとして実装する必要があります。

  • 統計を収集するパーティションが1つのみの場合は、ODCIColInfo型のTablePartitionフィールドにパーティション名が入力されます。それ以外の場合(全パーティションまたは表全体の統計を収集する必要がある場合)、TablePartitionフィールドはNULLです。

  • パーティション表のユーザー定義統計を収集するためにDBMS_STATSパッケージのメソッドが実行されると、ODCIStatsCollectコールがn+1回にわたって実行されます。ここでnは、この表のパーティション数です。最初のn回のコールは、ODCIColInfoTablePartition属性にパーティション名が設定され、ODCIStatsOptions.CallPropertyIntermediateCallに設定された状態で実行されます。最後のコールは、ODCIEnv.CallPropertyflagFinalCallに設定された状態で実行され、これによって表全体の集計統計を収集できます。

  • ユーザー定義統計が収集される表パーティションが1つのみの場合、ODCIStatsCollectが2回コールされます。最初のコールでは、パーティションの統計を収集する必要があります。このコールの場合、ODCIColInfo構造のTablePartition属性が入力され、ODCIEnv.CallPropertyFirstCallに設定されます。

  • 第2のコールでは、パーティションについて収集した新規統計に基づいて、表の集計統計を更新できます。このコールでは、ODCIEnv.CallPropertyflagが第2コールを示すFinalCallに設定されます。ODCIColInfo.TablePartitionには、両方のコールでパーティション名が入力されます。

  • ODCIStatsCollect()メソッドは、非パーティション・ドメイン索引、パーティション・ドメイン索引およびドメイン索引のパーティションに対して一度のみ起動されます。統計を収集するパーティションが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である場合、他の索引パーティションに対して収集された統計の可用性に応じて、ドメイン索引の統計を集計する必要があることに注意してください。すべての索引パーティションに対する統計が使用可能である場合、これらの統計を集計します。索引パーティションの統計がない場合は何もしないでください。

  • ローカル・システム管理ドメイン索引の統計を適切に収集するには、ODCIIndexInfo引数のIndexInfoFlagsフィールドとIndexPartitionフィールド、およびODCIEnv引数のCallPropertyを選択する必要があります。

  • ODCIIndexInfo.IndexPartition内の値は、すべての索引パーティションとサブパーティションのどちらの統計を収集する必要があるかを判断するために使用できます。統計収集の対象となるパーティション・レベルを決定するには、次のフラグを選択します。

    • ODCIConst.SubPartnおよびODCIConst.CompPartnが設定されている場合は、単一のサブパーティションについて統計を収集する必要があります。

      注意:

      ODCIIndexInfo.IndexPartitionが設定されていない場合は、ODCIConst.SubPartnが設定されることはありません。

    • ODCIConst.CompPartnが設定されているが、ODCIConst.SubPartnが設定されていない場合は、コンポジット・パーティションのすべてのサブパーティション、およびコンポジット・パーティション自体の統計を収集する必要があります。ODCIIndexInfo.IndexPartitionが設定されていない場合は、索引のすべてのコンポジット・パーティションについて同じ方法で統計が収集されます。

    • ODCIConst.CompPartnおよびODCIConst.SubPartnのどちらも設定されていない場合は、索引がコンポジット・パーティション化されておらず、指定されたパーティションの統計を収集する必要があります。ODCIIndexInfo.IndexPartitionが設定されていない場合は、すべてのパーティションの統計が収集されます。

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 説明

col

統計の削除対象の列。

statistics

OUT

パーティション表または索引の表レベル集計統計が含まれます。

env

ルーチンの実行環境に関する一般情報が含まれます。

ia

統計の削除対象のドメイン索引。

戻り値

ODCIConst.SuccessODCIConst.ErrorまたはODCIConst.Warning

使用上の注意

  • このファンクションは、STATICメソッドとして実装する必要があります。

  • このファンクションが非パーティション表に対してコールされる場合、ODCIStatsDeleteインタフェースのstatistics引数は無視されます。

  • パーティション表の統計が削除される場合、ODCIStatsDeleten+1回コールされます。最初のn回のコールでは、ODCIColInfo構造にパーティション名が入力され、ODCIEnv.CallPropertyIntermediateCallに設定されます。最後のコールでは、ODCIEnv.CallPropertyFinalCallに設定されます。

  • 最初のコールでは、特定のパーティションの統計が削除され、最後のコールでは削除された表の統計を保持するために作成された構造を削除またはクリーン・アップします。最後のコールでODCIColInfo.TablePartitionがNULLに設定されます。最初のコールでTablePartitionフィールドに入力されます。

  • 統計の削除対象となるパーティションが1つのみで、_minimal_stats_aggregationパラメータがFALSEに設定されている場合は、ODCIStatsDeleteが2回コールされます。各コールでは、ODCIColInfo.TablePartitionにパーティション名が入力されます。最初のコールでは、そのパーティションについて収集されたユーザー定義統計を削除します。2番目のコールでは、表の集計統計を更新します。

  • 統計の削除対象となるパーティションが1つで、_minimal_stats_aggregationTRUEに設定されている場合、ODCIStatsDeleteは1回のみコールされ、そのパーティションに対して収集されたユーザー定義統計を削除します。

  • _minimal_stats_aggregationの初期値はTRUEです。

  • ODCIStatsDelete()メソッドは、非パーティション・ドメイン索引、パーティション・ドメイン索引または索引パーティションに対して一度のみ起動されます。

  • 非パーティション・ドメイン索引の統計が削除される場合、ドメイン索引のユーザー定義統計を削除する必要があります。

  • パーティション・ドメイン索引の統計が削除される場合、ユーザーは集計されたドメイン索引の統計を削除し、ODCIEnv.CallPropertyOptionsに応じて、オプションですべてのドメイン索引パーティションのユーザー定義統計を削除する必要があります。

    • 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 説明
func

コストを計算するファンクションまたは型のメソッド。

cost
OUT

計算されたコスト(必ず正の整数)。

args

ファンクションまたは型のメソッドのコールに使用された実引数の説明。ファンクションにn個の引数がある場合、args配列にはn個の要素が含まれ、各要素でファンクションまたは型のメソッドの実引数が記述されます。

list

ファンクションまたは型のメソッドの実パラメータのリスト。各引数の数、位置および型は、ファンクションまたは型のメソッドと同じである必要があります。

env

ルーチンの実行環境に関する一般情報が含まれます。

戻り値

ODCIConst.SuccessODCIConst.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 説明
ia

交換する必要のある索引パーティションに関する情報

ia1

パーティションが交換された非パーティション表の索引に関する情報

env

ルーチンの実行環境に関する一般情報が含まれます。

戻り値

ODCIConst.SuccessODCIConst.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 説明
ia

統計の収集対象のドメイン索引。

sel

ユーザー計算による述語の選択性。

cost

計算されたコスト(必ず正の整数)。

qi

問合せに関する情報。

pred

述語に関する情報。

args

演算子がコールされたときの開始値終了値および実際の値引数の記述子。演算子にn個の引数がある場合、args配列にはn+1個の要素があり、最初の要素は開始値、2番目の要素は停止値、残りのn-1個の要素は演算子の実際の値引数(つまり最初の引数の後の引数)を示します。

start

演算子の下限(述語 fn(...) > 2)の場合は2など)。

stop

演算子の上限(述語fn(...) < 5の場合は5など)。

list

演算子の実パラメータ(2番目以降)のリスト。各引数の数、位置および型は、演算子と同じである必要があります。

env

ルーチンの実行環境に関する一般情報が含まれます。

戻り値

ODCIConst.SuccessODCIConst.ErrorまたはODCIConst.Warning

使用上の注意

  • 問合せ内の各表について、オプティマイザはパーティション・プルーニングを使用して、アクセス可能なパーティションの範囲を決定します。これらのパーティションは、興味のあるパーティションと呼ばれます。表の興味のあるパーティション・セットは、その表のすべてのドメイン索引の興味のあるパーティション・セットでもあります。ドメイン索引のコストは興味のあるパーティション・セットによって異なる場合があるため、オプティマイザは、列である引数について、ODCIStatsIndexCostargs引数として興味のある索引パーティションのリストを渡します(この引数の型である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 説明

pred

選択性の計算対象の述語。

sel

計算された選択性。パーセンテージを表す0から100の数値で表されます。

0より小さい数値または100より大きい数値は無効な値として無視されます。計算された選択性が0.5%未満の場合は、出力パラメータselで値として0が返されることがあります。選択性が0の場合でも、述語が削除されるわけではありません

args

ファンクション、型メソッドまたは演算子がコールされたときの開始値終了値および実際の引数の記述子。ファンクションにn個の引数がある場合、args配列にはn+2個の要素が含まれ、最初の要素は開始値、2番目の要素は終了値、残りのn個の要素は、ファンクション、メソッドまたは演算子の実際の引数を示します。

start

ファンクションの下限(述語 fn(...) > 2の場合は2など)。

stop

ファンクションの上限(述語fn(...) < 5の場合は5など)。

list

ファンクションまたは型のメソッドの実パラメータのリスト。各引数の数、位置および型は、ファンクション、型のメソッドまたは演算子と同じである必要があります。

env

ルーチンの実行環境に関する一般情報が含まれます。

戻り値

ODCIConst.SuccessODCIConst.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 説明

func

テーブル・ファンクション名。

outStats

戻されると思われる行数。

argDesc

テーブル・ファンクションの引数の説明。

list

引数のコンパイル時の値。実行時にのみ値を持つ式は、NULLで表されます。

戻り値

ODCIConst.SuccessODCIConst.ErrorまたはODCIConst.Warning

21.2.9 ODCIStatsUpdPartStatistics()

パーティション・メンテナンス操作中に統計を更新します。これにより、統計タイプはドメイン索引統計を修正して、パーティション・メンテナンス操作を適切に反映します。

構文

STATIC FUNCTION ODCIStatsCollect(
   ia ODCIIndexInfo,
   palist ODCIPartInfoList,
   env ODCIEnv) 
RETURN NUMBER
パラメータ IN/OUT 説明

ia

ドメイン索引に関する情報が含まれます。パーティションの特定情報は含まれません。

palist

削除または追加されるパーティションに関する情報が含まれます。

env

ルーチンに渡される環境ハンドル

戻り値

ODCIConst.SuccessODCIConst.ErrorまたはODCIConst.Warning

  • SYSTEM MANAGEDアプローチを使用して統計タイプが指定される場合、ODCIStatsUpdPartStatistics()メソッドはPMO時に一度のみ起動します。メソッド実装ではDMLおよび問合せのみが許可されます。

  • グローバル非パーティション表のドメイン索引統計をメンテナンスする場合、削除したパーティションのユーザー定義統計のエントリを削除する必要があります(またはオプションで、追加パーティションにNULLエントリを追加します)。ODCIEnv.CallPropertyStatsGlobalAndPartitionまたはStatsPartitionである場合は、チェック可能です。ODCIEnv.CallPropertyStatsGlobalAndPartitionである場合、使用可能なすべての索引パーティションの統計を集計する必要があります。ODCIEnv.CallPropertyStatsPartitionの場合、集計統計を単に削除するか、そのままにしておくことも可能です。ODCIEnv.CallPropertyはこのコールに対してStatsGlobalになりません。

  • ユーザーはODCIEnv.CallPropertyによって渡された情報を使用して、削除および調整する統計タイプを決定する必要があります。

  • メソッドがODCIConst.Errorに戻ると、エラーは無視されパーティション管理作業が継続されます。