10 拡張可能オプティマイザの使用

Oracle Databaseの拡張可能オプティマイザを使用して、SQL文の実行を最適化することができます。ここでは、最適化の概念、統計、選択性、コスト分析、述語の順序付けおよびオプティマイザの依存性モデルについて説明します。

10.1 問合せ最適化の概念

問合せ最適化は、SQL文を実行する最も効率的な方法を選択するプロセスです。拡張可能索引付け機能の詳細は、ユーザー定義のアクセス方法を説明している演算子の定義を参照してください。

拡張可能オプティマイザ機能を使用すると、ユーザー定義関数およびユーザー定義索引の作成者は、問合せ計画を選択するオプティマイザで使用される統計収集、選択性およびコスト・ファンクションを作成できます。オプティマイザ・コスト・モデルは、CPUコストが使用するマシンの命令の数で、I/Oコストがフェッチされるデータ・ブロックの数である場合、CPUおよびI/Oにアクセスするユーザーが提供した情報を統合するよう拡張されています。

具体的には、次の処理を実行できます。

  • コスト・ファンクションおよびデフォルトのコストをドメイン索引(パーティションまたは非パーティション)、索引タイプ、パッケージおよびスタンドアロン・ファンクションと関連付けることができます。オプティマイザでは、単一のドメイン索引パーティション、複数のドメイン索引パーティションまたは索引全体のスキャンのコストを取得できます。

  • 選択性ファンクションおよびデフォルトの選択性をオブジェクト型、パッケージ・ファンクションおよびスタンドアロン・ファンクションのメソッドと関連付けることができます。オプティマイザでは、単一パーティション、複数パーティションまたは問合せに関連する表全体のユーザー定義の選択性の見積もりができます。

  • 統計収集ファンクションをドメイン索引および表の列と関連付けることができます。オプティマイザでは、ユーザー定義統計をドメイン索引または表に対するパーティション・レベルおよびオブジェクト・レベルの両方で収集できます。

  • 述語をコストに基づいたファンクションで順序付けできます。

  • アクセス・コストに基づいた表に対してユーザー定義のアクセス方法(ドメイン索引)を選択できます。

  • DBMS_STATSパッケージを使用してユーザー定義統計収集を起動し、ファンクションを削除できます。

  • 新規のデータ・ディクショナリ・ビューを使用して、列、ドメイン索引、索引タイプまたはファンクションに関連付けられている統計収集、コストまたは選択性ファクションに関する情報を含めることができます。

  • ファンクションの述語の評価順序を保持するヒントを追加できます。

コストベース・オプティマイザのみが強化されていることに注意してください。オラクル社ではルールベース・オプティマイザの操作は変更していません。

オプティマイザにより、SQL問合せおよびDML文であるSELECTINSERTUPDATEまたはDELETEの実行計画が生成されます。単純化するために、ここではSELECT文に関する実行計画の生成について説明しますが、DML文に関するプロセスも類似しています。

実行計画には、FROM句での各表のアクセス方法と、FROM句での表の順序付け(結合順序)が含まれます。システム定義のアクセス方法は、索引、ハッシュ・クラスタおよび表スキャンなどです。オプティマイザは、一連の結合順序または順列を生成し、それぞれのコストを計算し、最小コストの結合順序を選択することで計画を選択します。結合順序に含まれる表ごとに、オプティマイザはそれぞれの可能なアクセス方法および結合方法のコストを計算し、最小コストの方法を選択します。結合順序のコストは、アクセス方法のコストと結合方法のコストの合計です。コストは、コスト・モデルを構成するアルゴリズムを使用して計算されます。コスト・モデルには、問合せが実行される物理環境に関する様々なレベルの詳細が含まれます。

オプティマイザは問合せで参照されるオブジェクトの統計を使用して、選択性およびコストを計算します。統計はDBMS_STATSパッケージを使用して収集されます。述語の選択性とは、述語によって選択される表内の行の割合のことで、0から1の数値で示されます。

拡張可能索引付け機能により、ユーザーは新しい演算子、索引タイプおよびドメイン索引を定義できます。ユーザー定義演算子およびドメイン索引では、拡張可能オプティマイザ機能により、ユーザーはオプティマイザで実行計画の選択に使用される3つの主要構成要素(統計、選択性およびコスト)を制御できます。

関連項目:

10.1.1 統計

表および索引の統計は、DBMS_STATSパッケージを使用して生成できます。一般的に、統計をより正確にするためには、実行計画をオプティマイザで生成すると有効です。

10.1.1.1 ユーザー定義の統計

拡張可能オプティマイザ機能では、ドメイン索引、索引タイプ、データ型、個々の表列およびパーティションに対して統計収集ファンクションを定義できます。つまり、ドメイン索引を分析する場合は常に、ユーザー指定の統計収集ファンクションにコールされます。データベースは、ユーザーが収集した統計との区別を判別しません。

ドメイン索引に加えて、個別の表列およびユーザー定義のデータ型に対して、ユーザー定義の統計収集ファンクションがサポートされています。前者の場合、列を分析すると、標準統計はデータベースで収集されますが、ユーザー定義の統計収集ファンクションもコールされて統計が収集されます。データ型に対して統計収集ファンクションが存在する場合は、必要な型を含む分析された表列ごとにこのファンクションがコールされます。

ユーザー定義関数を評価するコストは、アルゴリズムおよび引数の統計プロパティによって異なります。すべてのファンクションに対する引数として使用される列の組合せの統計を、すべて格納することは実用的ではありません。したがって、オラクル社は個別の表の統計のみを保持しています。また、ファンクション・コストは、各引数の異なる統計プロパティによっても異なる場合があります。すべての列に対して、使用可能なすべてのファンクションのすべての引数位置に対する統計が必要である場合があります。オラクル社は、パフォーマンスの低下を避けるため、あらゆるケースに対応する統計およびコスト・ファンクションはサポートしていません。

定義の統計収集ファンクションがある場合は、統計を削除するためのユーザー定義関数が必要です。

10.1.1.2 パーティション・オブジェクトのユーザー定義統計

システム管理ローカル・ドメイン索引を使用する場合、ODCIStatsインタフェースの2つのメソッド(ODCIStatsExchangePartition()およびODCIStatsUpdPartStatistics())を実装する必要があります。

10.1.2 選択性

オプティマイザは統計を使用して、述語の選択性を計算します。選択性は、述語が表またはパーティションから選択する行の割合です。0から1の数値で表示されます。述語の選択性は、特定のアクセス方法のコストの見積りに使用され、また最適な結合順序の決定にも使用されます。オプティマイザで結合順序の選択を誤ると、実行計画のコストが非常に大きくなる場合があります。

現在、オプティマイザは、スタンドアロン・アルゴリズムを使用して、選択述語および結合述語の選択性を見積もります。ただし、述語にファンクションまたは型のメソッドが含まれるとアルゴリズムが正常に機能しない場合があります。さらに、述語にオプティマイザが情報を持たないユーザー定義演算子が含まれる可能性があります。その場合、オプティマイザでは選択性が正確に計算されません。

10.1.2.1 ユーザー定義の選択性

オプティマイザによって選択性の見積りを制御するために、この機能によって、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドを含む述語のユーザー定義の選択性ファンクションを指定できます。例10-1に示されている形式の述語が検出されると、ユーザー定義の選択性ファンクションはオプティマイザによってコールされます。

このような場合、ユーザーはoperator(...)に関連付けられた選択性ファンクションを定義できます。operatorの引数は、列、定数、バインド変数または属性参照の可能性があります。オプティマイザでこのような述語が検出されると、ユーザー定義の選択性ファンクションがコールされ、述語全体が引数(演算子、ファンクション(または型メソッド)とその引数、関係演算子relational_operator、定数式またはバインド変数など)として渡されます。ユーザー定義の選択性ファンクションの戻り値は、0から100のパーセンテージで表される必要があります(この範囲外の値は無視されます)。

可能な場合はユーザー定義の選択性の値が使用されます。ただし、次の場合を除きます。

  • ユーザー定義の選択性ファンクションが無効な値(0より小さく100より大きい値).を戻す場合

  • 述語に演算子、ファンクションまたはメソッドに定義されたユーザー定義の選択性ファンクションが含まれない場合

  • 述語が例10-1にリストされている形式になっていない、あるいはoperator(...) + 3 relational_operator constantという形式になっている場合

いずれの場合も、経験則を使用して選択性が見積もられます。

例10-1 コールをオプティマイザにトリガーする3つの述語形式

operator(...) relational_operator constant
constant relational_operator operator(...)
operator(...) LIKE constant

各項目の意味は次のとおりです。

  • operator(...)は、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドです。

  • relational_operatorは、{<, <=, =, >=, >}のいずれかです。

  • constantは、定数値式またはバインド変数です。

10.1.3 コスト

オプティマイザは、各種アクセス・パスのコストを見積もり、適切な計画を選択します。たとえば、索引および全表スキャンを使用してCPUコストおよびI/Oコストを計算して2つのいずれかを選択します。ただし、オプティマイザでは、ドメイン索引の内部記憶域構造は判別されないため、ドメイン索引のコストの見積りは正確には計算されません。

10.1.3.1 ユーザー定義のコスト

柔軟に対応するために、コスト・モデルではドメイン索引、索引パーティションおよびユーザー定義のスタンドアロン・ファンクション、パッケージ・ファンクションおよび型のメソッドに対するコストを定義できるよう拡張されています。ユーザー定義のコストは、オプティマイザが参照するデフォルトのコストの形式であるか、コスト計算のためにオプティマイザによってコールされた機能の充実したコスト・ファンクションである場合があります。

ユーザー定義の選択性統計と同様、ユーザー定義のコスト統計はオプションです。どのユーザー定義のコストも使用不可である場合は、経験則を使用して見積りが計算されます。ただし、ユーザー定義のドメイン索引およびファンクションの記憶域構造に関する有用な情報が十分でない場合には、そのような見積りは非常に不正確である可能性があり、次善の実行計画が選択されます。

ドメイン索引のユーザー定義コスト・ファンクションは、ドメイン索引がユーザー定義演算子の有効なアクセス・パスである場合にのみオプティマイザによってコールされます。ファンクション、メソッドおよびドメイン索引に対するユーザー定義のコスト・ファンクションは、例10-1に示した形式のうち、いずれかの形式の述語である場合にのみコールされ、ユーザー定義の選択性ファンクションの条件と同一である必要があります。

ユーザー定義のコスト・ファンクションからは次の3つのコスト値が戻されます。各値はファンクションまたはドメイン索引の実装の1回の実行コストを表します。

  • CPU - ファンクションまたはドメイン索引実装で実行されているマシン・サイクルの数。この値にはファンクション起動時のオーバーヘッドは含まれません。

  • I/O - ファンクションまたはドメイン索引実装で読み取られたデータ・ブロックの数。ドメイン索引には、Oracle表へのアクセスは含まれていません。マルチブロックのI/Oファクタはユーザー定義のコスト・ファンクションには渡されません。

  • NETWORK - 転送されたデータ・ブロックの数。これは分散問合せ、ファンクションおよびドメイン索引の実装に有効です。このコスト構成要素は使用されずに無視されますが、下位互換性を確保するためにユーザーは値を要求する必要があります。

オプティマイザはこれらのコストの値からコンポジット・コストを計算します。

DBMS_ODCIパッケージにはestimate_cpu_unitsファンクションが含まれており、ユーザー・ファンクションの経過時間で構成される入力からCPUコストとI/Oコストを取得できるようになっています。estimate_cpu_unitsでは、経過時間にマシンのプロセッサ速度を乗算してCPU単位が測定され、ユーザー・ファンクションに関連するCPU命令の概数が戻されます。マルチプロセッサ・マシンの場合は、estimate_cpu_unitsでシングル・プロセッサの速度が考慮されます。

問合せのコストはコストの値のファンクションです。オプティマイザの初期化パラメータの設定によって、どのコストを最小限に抑えるかを決定します。optimizer_modefirst_rowsの場合は、単一行を戻す場合のリソース・コストが最小限に抑えられ、オプティマイザ・モードがユーザー定義のコスト・ファンクションに渡されます。それ以外の場合は、戻されるすべての行のリソース・コストが最小限に抑えられます。

10.2 統計、選択性およびコスト・ファンクションの定義

ドメイン索引および列に対するユーザー定義統計を計算および格納できます。ファンクションおよびドメイン索引に対するユーザー定義の選択性およびコスト・ファンクションでは、標準統計およびユーザー定義統計が計算に使用されます。これらの統計の内部表現に関してオラクル社に報告する必要はありませんが、これらの収集のメソッドを提供する必要があります。そのような統計の表現を定義し、保持する必要があります。ユーザー収集統計は、ユーザー定義の選択性およびコスト・ファンクションによってのみ使用され、オプティマイザは標準統計のみ使用することに注意してください。

ユーザー定義の統計収集、選択性およびコスト・ファンクションは、ユーザー定義型で定義される必要があります。この型では、サポートが必要な機能に応じて、拡張可能オプティマイザ・インタフェースで説明するシステム・インタフェースODCIStats (Oracle Data Cartridge Interface Statistics)で定義されているファンクションの一部または全部をメソッドとして実装する必要があります。

例10-2に、ODCIStatsインタフェース内のすべてのファンクションを実装する型定義(または概要の1つ)を示します。

統計タイプと呼ばれるユーザー定義のオブジェクト型は、ODCIStatsのすべてのファンクションを実装する必要はありません。ユーザー定義の統計収集、選択性およびコスト・ファンクションはオプションであるため、統計タイプに含まれるのはODCIStats内のファンクションのサブセットのみの場合があります。表10-1に、各種のスキーマ・オブジェクトに関連付けられている型メソッドとデフォルトの統計をまとめます。

表10-1 各種のスキーマ・オブジェクトに対する統計メソッドおよびデフォルトの統計

関連する統計 使用されている統計タイプのメソッド デフォルトの統計

ODCIStatsCollect()ODCIStatsDelete()

オブジェクト型

ODCIStatsCollect()ODCIStatsDelete()ODCIStatsFunctionCost()ODCIStatsSelectivity()

コスト、選択性

ファンクション

ODCIStatsFunctionCost()ODCIStatsSelectivity()

コスト、選択性

パッケージ

ODCIStatsFunctionCost()ODCIStatsSelectivity()

コスト、選択性

索引

ODCIStatsCollect()ODCIStatsDelete()ODCIStatsIndexCost()

コスト

索引タイプ

ODCIStatsCollect()ODCIStatsDelete()ODCIStatsIndexCost()ODCIStatsUpdPartStatistics()ODCIStatsExchangePartition()

コスト

統計タイプのメソッドのパラメータの型は、システム定義のODCIデータ型です。詳細は、拡張可能オプティマイザ・インタフェースを参照してください。

選択性およびコスト・ファンクションによって、データベースまたはパッケージの状態が変更されることはありません。そのため、SQL DDL操作またはDML操作は選択性およびコスト・ファンクションでは許可されていません。このような操作が可能である場合、ファンクションはオプティマイザによってコールされません。

10.2.1 統計タイプの定義

例10-2 統計タイプの定義

CREATE TYPE my_statistics AS OBJECT (

  -- Function to get current interface
  FUNCTION ODCIGetInterfaces(ifclist OUT ODCIObjectList) RETURN NUMBER,

   -- User-defined statistics functions
  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,
  FUNCTION ODCIStatsDelete(col ODCIColInfo, statistics OUT RAW, env ODCIEnv) 
    RETURN NUMBER,
  FUNCTION ODCIStatsDelete(ia ODCIIndexInfo, statistics OUT RAW, env ODCIEnv) 
    RETURN NUMBER,
   
  -- User-defined statistics functions for local domain index
  FUNCTION ODCIStatsUpdPartStatistics(ia ODCIIndexInfo, palistODCIPartInfoList,
    env ODCIEnv) RETURN NUMBER;
  FUNCTION ODCIStatsExchangePartition(ia ODCIIndexInfo, ia1 ODCIIndexInfo, 
    env ODCIEnv) RETURN NUMBER;

  -- User-defined selectivity function
  FUNCTION ODCIStatsSelectivity(pred ODCIPredInfo, sel OUT NUMBER, args
    ODCIArgDescList, start <function_return_type>,
    stop <function_return_type>, <list of function arguments>, 
    env ODCIEnv) RETURN NUMBER,

  -- User-defined cost function for functions and type methods
  FUNCTION ODCIStatsFunctionCost(func ODCIFuncInfo, cost OUT ODCICost,
    args ODCIArgDescList, <list of function arguments>) RETURN NUMBER,

  -- User-defined cost function for domain indexes
  FUNCTION ODCIStatsIndexCost(ia ODCIIndexInfo, sel NUMBER,
    cost OUT ODCICost, qi ODCIQueryInfo, pred ODCIPredInfo,         
    args ODCIArgDescList, start <operator_return_type>,
    stop <operator_return_type>, <list of operator value arguments>, 
    env ODCIEnv) RETURN NUMBER
)

10.2.2 ユーザー定義の統計ファンクション

2つのユーザー定義の統計収集ファンクション(収集統計用とファンクションの削除用)があります。

最初のファンクションであるODCIStatsCollect()は、ユーザー定義統計の収集に使用され、そのインタフェースは列またはドメイン索引が分析されているかどうかによって異なります。表列またはドメイン索引の分析時にコールされ、次の2つのパラメータを取ります。

  • 分析されている列に対するcolまたは分析されているドメイン索引に対するia

  • DBMS_STATSパッケージに指定されているオプションに対するoptions

前述したように、ODCIStatsCollect()によって収集される統計はデータベースで解析されません。システム管理ドメイン索引統計では、ODCIStatsCollect()で収集された統計を戻す必要はありません。これらの統計はユーザー管理形式で格納する必要があります。これについては、システム管理ドメイン索引の統計の生成および図10-1図10-2図10-3の各図で説明しています。

ユーザーが収集した統計は、ODCIStatsDelete()ファンクションをコールすることで削除されます。このファンクションのインタフェースは、列とドメイン索引のどちらの統計が削除されるかによって異なります。列のユーザー定義統計を削除する場合はパラメータcolを取り、ドメイン索引の統計を削除する場合はパラメータiaを取ります。

ユーザー定義のODCIStatsCollect()ファンクションが統計タイプで存在する場合は、対応するODCIStatsDelete()ファンクションも存在する必要があります。

ODCIStatsCollect()ファンクションおよびODCIStatsDelete()ファンクションの戻り値は、Success(成功)、Error(エラー)またはWarning(警告)で、システム・パッケージのODCIConstに定義されています。

10.2.3 ユーザー定義の選択性ファンクション

ユーザー定義の選択性ファンクションは、例10-1にリストされている形式の述語にのみ使用されます。

ユーザー定義の選択性ファンクションODCIStatsSelectivity()は、述語を記述する次の5セットの入力パラメータを取ります。

  • ファンクションoperatorと関係演算子relational_operatorを記述するpredパラメータ。

  • ファンクションの開始値と終了値(<constant>)およびファンクション(operator())の実引数を記述するargsパラメータ。

  • データ型がファンクションの戻り値と同じで、かつファンクションの開始値を記述するstartパラメータ。

  • データ型がファンクションの戻り値と同じで、かつファンクションの停止値を記述するstopパラメータ。

  • 番号、位置および型がファンクションoperatorの引数と一致するファンクション引数のリスト。

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

ODCIStatsSelectivity()ファンクションの戻り値はSuccessErrorまたはWarningのいずれかです。

例10-3で定義された関数myFunctionを例に説明します。

ユーザー定義の選択性ファンクションODCIStatsSelectivity()の詳細は、拡張可能オプティマイザ・インタフェースで説明します。

myFunction()myFunction(2, 'TEST') > 5などのリテラル引数を使用してコールされた場合、例10-4で概要が示されているように、選択性ファンクションがコールされます。

これに対して、col_aが表Test_tabの列であるときにmyFunction()myFunction(Test_tab.col_a, 'TEST')> 5などのいくつかの非リテラル引数でコールされた場合、例10-5で概要が示されているように、選択性ファンクションがコールされます。

要約すると、引数がリテラルである場合にのみ、開始値、終了値およびファンクションの引数の値が選択性ファンクションに渡され、それ以外の場合は、引数はNULLです。前述に該当するすべての引数については、ODCIArgDescListで説明しています。

例10-3 ユーザー定義ファンクションの定義

myFunction (a NUMBER, b VARCHAR2(10)) return NUMBER

例10-4 リテラル引数を使用した選択性ファンクションのコール

ODCIStatsSelectivity(ODCIPredInfo_constructor, sel,
   ODCIArgDescList_constructor, 5, NULL, 2, 'TEST', ODCIEnv_flag)

例10-5 非リテラル引数を使用した選択性ファンクションのコール

ODCIStatsSelectivity(ODCIPredInfo_constructor, sel,
   ODCIArgDescList_constructor, 5, NULL, NULL, 'TEST', ODCIEnv_flag)

10.2.4 ファンクション用のユーザー定義のコスト・ファンクション

ユーザー定義のコスト・ファンクションは例10-1にリストされている形式の述語にのみ使用されます。

スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドのコストを計算するファンクションODCIStatsFunctionCost()を定義できます。このファンクションは、述語が記述された次の3つの一連の入力パラメータを取ります。

  • ファンクションoperatorを記述するfuncパラメータ。

  • ファンクションoperatorの実引数を記述するargsパラメータ。

  • 番号、位置および型がファンクションoperatorの引数と一致するファンクション引数のリスト。

ODCIStatsFunctionCost()ファンクションは、costパラメータに計算されたコストを戻します。戻されたコストには2つの構成要素(CPUコストおよびI/Oコスト)が含まれており、オプティマイザによって結合されてコンポジット・コストが計算されます。ユーザー定義のコスト・ファンクションによって戻されたコストは必ず正の整数です。無効な値は無視されます。

ODCIStatsFunctionCost()ファンクションの戻り値はSuccessErrorまたはWarningのいずれかです。

例10-3に定義されているmyFunction()について考えてみます。

ユーザー定義のコスト・ファンクションODCIStatsFunctionCost()の詳細は、拡張可能オプティマイザ・インタフェースで説明します。

col_aが表Test_tabの列であるときにmyFunction()myFunction(2, 'TEST') > 5リテラル引数を使用してコールされた場合、例10-6で概要が示されているように、コスト・ファンクションがコールされます。

これに対して、col_aが表Test_tabの列であるときにmyFunction()myFunction(Test_tab.col_a, 'TEST') > 5などの非リテラル引数でコールされた場合、例10-7で概要が示されているように、コスト・ファンクションがコールされます。

要約すると、引数がリテラルである場合にのみ、ファンクションの引数の値がコスト・ファンクションに渡され、それ以外の場合には引数はNULLです。前述に該当するすべての引数については、ODCIArgDescListで説明しています。

例10-6 リテラル引数を使用したコスト・ファンクションのコール

ODCIStatsFunctionCost(ODCIFuncInfo_constructor, cost,
   ODCIArgDescList_constructor, 2, 'TEST', ODCIEnv_flag)

例10-7 非リテラル引数を使用したコスト・ファンクションのコール

ODCIStatsFunctionCost(ODCIFuncInfo_constructor, cost,
   ODCIArgDescList_constructor, NULL, 'TEST', ODCIEnv_flag)

関連項目:

10.2.5 ドメイン索引用のユーザー定義のコスト・ファンクション

ドメイン索引用のユーザー定義のコスト・ファンクションは、すでに説明したように同じ型の述語に使用されますが、operatorが、有効なドメイン索引のアクセス・パスが存在するユーザー定義演算子である場合を除きます。

ODCIStatsIndexCost()ファンクションは次の一連のパラメータを取ります。

  • ドメイン索引が記述されたia

  • ユーザー計算による述語の選択性を表すsel

  • 計算されたコストを表すcost

  • 問合せに関する追加情報を含むqi

  • 述語が記述されたpred

  • 演算子の開始値と終了値(<constant>)および演算子operatorの実引数を記述するargs

  • データ型が演算子の戻り値と同じであり、かつ演算子の開始値を記述するstart

  • データ型が演算子の戻り値と同じであり、かつ演算子の終了値を記述するstop

  • 数、位置および型が演算子operatorの引数と一致する演算子の値引数のリスト。演算子の値引数は2番目以降の引数です。

  • 同じルーチンが複数回コールされる場合に、どのコールが実行されているかを示すためにサーバーで設定される環境フラグenvは、将来使用するために予約されており、現在は常に0に設定されています。

ドメイン索引の計算されたコストは出力パラメータ(cost)で戻されます。

ODCIStatsIndexCost()SuccessErrorまたはWarningを戻します。

例10-8に定義された、文字列b_stringが文字列a_stringに含まれるかどうかに応じて1または0を戻す演算子について考えてみます。また、演算子がドメイン索引によって実装されるとします。

ユーザー定義の索引コスト・ファンクションODCIStatsIndexCost()の詳細は、拡張可能オプティマイザ・インタフェースで説明します。

contains()Contains(Test_tab.col_c,'TEST') <= 1などの非リテラル引数を使用してコールされた場合、例10-9で概要が示されているように、索引コスト・ファンクションがコールされます。

Containsの第1引数a_stringODCIStatsIndexCost()のパラメータとしては表示されないことに注意してください。演算子の第1引数は、使用されるドメイン索引の列である必要があり、この列情報はODCIIndexInfoパラメータを介して渡されます。演算子の第2引数(値引数)以降のみがODCIStatsIndexCost()ファンクションのパラメータとして表示されます。

要約すると、引数がリテラルである場合にのみ、開始値、終了値および演算子の引数の値がコスト・ファンクションに渡され、それ以外の場合には引数はNULLです。前述に該当するすべての引数については、ODCIArgDescListで説明しています。

例10-8 演算子の定義

Contains(a_string VARCHAR2(2000), b_string VARCHAR2(10))

例10-9 非リテラル引数を使用した索引コスト・ファンクションのコール

ODCIStatsIndexCost(ODCIIndexInfo_constructor, sel, cost,
   ODCIQueryInfo_constructor, ODCIPredInfo_constructor, 
   ODCIArgDescList_constructor, NULL, 1, 'TEST', ODCIEnv_flag)

関連項目:

ODCIStatsIndexCost()

10.2.6 システム管理ドメイン索引の統計の生成

ドメイン索引の保持にシステム管理アプローチを選択し、統計タイプをドメイン索引または索引タイプに関連付ける必要がある場合、統計タイプもシステムで管理する必要があります。

システム管理ドメイン索引に対してODCIStatsCollect()コールが発行される場合、統計が収集される場合があります。非パーティション索引の場合、統計は個別の表として索引記憶表と格納されるか、データ・カートリッジのメタデータ表に修飾行の索引名と格納されることがあります。

ローカル・パーティション・ドメイン索引の場合、統計の格納方法には3つのオプションがあります。いずれのオプションでも、パーティションのメンテナンス操作ではODCIStatsUpdPartStatistics()メソッドが使用されます。次のどの例でも、ODCIStatsUpdPartStatistics()コール内ではDDLが実行されず、ODCIStatsUpdPartStatistics()の実装ではDMLと問合せの命令のみが許可されることに注意してください。

10.2.6.1 索引表への索引パーティション統計の格納

図10-1に示すように、統計が索引付けされたデータとともに索引記憶域表(システム・パーティション)に格納される場合は、ODCIStatsUpdPartStatistics()メソッドがコールされます。このメソッドでは、オプションで統計関連のパーティション・メタデータを保持できます。あるいは、操作をNULLにすることもできます。影響を受けるパーティションの統計は、パーティションに固有の索引データとともにサーバーから削除されます。

図10-1 索引表を伴う索引固有の統計の格納

図10-1の説明が続きます
「図10-1 索引表を伴う索引固有の統計の格納」の説明
10.2.6.2 個別の表への索引パーティション統計の格納

図10-2に示すように統計が個別のシステム・パーティション表に格納される場合は、サーバーがODCIStatsCollect()コールの際に統計を格納するこれらのシステム・パーティション表の作成を追跡します。サーバーでは、これらの表が索引記憶域表と同じ方法で管理されます。

図10-2 個別の表への索引固有の統計の格納

図10-2の説明が続きます
「図10-2 個別の表への索引固有の統計の格納」の説明
10.2.6.3 共通の表への索引パーティション統計の格納

図10-3に示されるように、統計が非パーティション表に修飾行のスキーマ名、索引名またはパーティション名のいずれかで格納される場合、ODCIStatsUpdPartStatistics()へのコールとともにパーティション・レベル統計を保持する必要があります。サーバーは、これらの表に対してどの操作も実行しません。

図10-3 共有の表への索引パーティション統計の格納

図10-3の説明が続きます
「図10-3 共有の表への索引パーティション統計の格納」の説明

10.3 ユーザー定義統計、選択性およびコストの使用

統計タイプは、オプティマイザによる実行計画の選択に影響を与えるユーザー定義関数のインタフェースとして機能します。ただし、統計タイプを使用できるオプティマイザの場合、列、スタンドアロン・ファンクション、オブジェクト型、索引、索引タイプまたはパッケージなどのデータベース・オブジェクトに統計タイプをバインドするメカニズムが必要です。表またはドメイン索引のパーティションに統計タイプを関連付けることはできません。ASSOCIATE STATISTICSコマンドを使用してこの関連付けを作成します。

10.3.1 ユーザー定義の統計

ユーザー定義の統計ファンクションは、標準SQLデータ型およびオブジェクト型の両方を使用する列、およびドメイン索引に関連しています。ファンクションODCIStatsSelectivity()ODCIStatsFunctionCost()およびODCIStatsIndexCost()はユーザー定義統計には使用されず、統計タイプは、これらのファンクションの実装に必要のないユーザー定義統計の収集にのみ使用されます。

ユーザーは独自の表を作成できます。この場合、これらの表への権限が適切に管理され、表のバックアップおよびリストアが他のディクショナリ表とともに完了され、またポイントインタイム・リカバリの考慮事項が解決される必要があります。

10.3.1.1 列統計

例10-10で定義されているように、typ1がオブジェクト型の場合のTest_tabについて考えてみます。

statODCIStatsCollect()およびODCIStatsDelete()ファンクションを実装する統計タイプだと想定します。例10-11に示しているように、統計タイプを列でバインドする場合、列col_bDBMS_STATSパッケージによってユーザー定義統計が収集されます。

列のリストは、統計タイプstatと関連付けることができます。オブジェクト型の属性ではなく最上位レベルの列への関連付けのみがサポートされていることに注意してください。必要であれば、ODCIStatsCollect()ファンクションを使用して列をトラバースすることで、個々の属性統計を収集できます。

ユーザー定義統計を収集するもう1つの方法として、データ型との関連付けを宣言できます。例10-12では、型typ1の統計タイプとしてstat_typ1を宣言しています。表Test_tabをこの関連付けで分析すると、統計タイプstat_typ1ODCIStatsCollect()ファンクションを使用して、列col_bについてユーザー定義統計が収集されます。

個別の列の関連付けは、常に型の関連付けより優先されます。そのため、前述の例では、両方のASSOCIATE STATISTICSコマンドが発行される場合に、DBMS_STATSで統計タイプstat (stat_typ1ではなく)を使用して列col_bのユーザー定義統計が収集されます。また、可能であれば標準統計がユーザー定義統計とともに収集されることに注意が必要です。

ユーザー定義統計は、統計の収集に使用された同じ統計タイプからODCIStatsDelete()ファンクションを使用して削除されます。

ASSOCIATE STATISTICSコマンドによって定義される関連付けはASSOCIATION$と呼ばれるディクショナリ表に格納されます。

ユーザー定義データ型のみに統計タイプを関連付けることができます。標準SQLデータ型で関連付けを宣言することはできません。

例10-10 オブジェクト型列を含む表の作成

CREATE TABLE Test_tab (
   col_a    NUMBER,
   col_b    typ1,
   col_c    VARCHAR2(2000)
)

例10-11 ユーザー定義統計の列に対する統計の関連付け

ASSOCIATE STATISTICS WITH COLUMNS Test_tab.col_b USING stat

例10-12 統計とユーザー定義統計のデータ型の関連付け

ASSOCIATE STATISTICS WITH TYPES typ1 USING stat_typ1
10.3.1.2 ドメイン索引統計の実装

ドメイン索引には索引タイプが含まれます。システム管理ドメイン索引の統計タイプは、その索引タイプにのみ関連付けられることで定義されます。例10-13で、索引タイプ、索引および例10-10の表Test_tabの演算子の作成方法を説明します。

indtypeは索引タイプ、userOpindtypeでサポートされるユーザー定義演算子、userOp_funcuserOpのファンクション実装、imptypeは索引タイプindtypeの実装タイプです。

例10-14で示されるように、統計タイプstat_indtypeはシステム管理索引タイプに関連付けることができます。索引タイプがindtypeであるドメイン索引Test_indxを分析すると、stat_indtypeODCIStatsCollect()ファンクションがコールされて索引のユーザー定義統計が収集されます。

索引統計を削除するには、前述のODCIStatsCollect()メソッドと同じ統計タイプに定義されているODCIStatsDelete()メソッドを使用します。

例10-13 ユーザー定義統計の索引タイプ、索引および演算子の作成

CREATE INDEXTYPE indtype
FOR userOp(NUMBER)
USING imptype WITH SYSTEM MANAGED STORAGE TABLES;

CREATE INDEX Test_indx ON Test_tab(col_a)
INDEXTYPE IS indtype PARAMETERS('example');

CREATE OPERATOR userOp BINDING (NUMBER) RETURN NUMBER
USING userOp_func;

例10-14 統計とシステム管理索引タイプの関連付け

ASSOCIATE STATISTICS WITH INDEXTYPES indtype USING stat_indtype
WITH SYSTEM MANAGED STORAGE TABLES

10.3.2 ユーザー定義の選択性

選択性ファンクションを使用して、問合せでの述語の選択性が計算されます。述語には適切な形式が含まれ、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドが含まれる場合があります。

10.3.2.1 ユーザー定義演算子

例10-15の関連付けが宣言されているとします。オプティマイザでuserOp(Test_tab.col_a) = 1述語が検出されると、userOp演算子のuserOp_funcのファンクション実装に関連付けられている統計タイプstat_userOp_func内のODCIStatsSelectivity()ファンクション(存在する場合)がコールされます。

例10-15 統計とユーザー定義演算子の関連付け

ASSOCIATE STATISTICS WITH FUNCTIONS userOp_func USING stat_userOp_func
10.3.2.2 スタンドアロン・ファンクション

例10-16に示す関連付けがスタンドアロン・ファンクションmyFunctionに対して宣言されると、myFunction(Test_tab.col_a, 'TEST') = 1述語の統計タイプstat_myFunction内のODCIStatsSelectivity()ファンクション(存在する場合)がコールされます。

例10-16 統計とスタンドアロン・ファンクションの関連付け

ASSOCIATE STATISTICS WITH FUNCTIONS myFunction USING stat_MyFunction
10.3.2.3 パッケージ・ファンクション

例10-17に示す関連付けがパッケージDemo_packに対して宣言されると、myDemoPackFunctionDemo_pack内のファンクションである場合にDemo_pack.myDemoPackFunction(Test_tab.col_a, 'TEST') = 1述語の統計タイプstat_Demo_pack内のODCIStatsSelectivity()ファンクション(存在する場合)がコールされます。

例10-17 統計とパッケージ・ファンクションの関連付け

ASSOCIATE STATISTICS WITH PACKAGES Demo_pack USING stat_Demo_pack
10.3.2.4 型メソッド

例10-18に示す関連付けが型Example_typに対して宣言されると、myExampleTypMethodExample_typ内のメソッドである場合にmyExampleTypMethod(Test_tab.col_b) = 1述語の統計タイプstat_Example_typ内のODCIStatsSelectivity()ファンクション(存在する場合)がコールされます。

例10-18 統計と型メソッドの関連付け

ASSOCIATE STATISTICS WITH TYPES Example_typ USING stat_Example_typ
10.3.2.5 デフォルトの選択性

選択性ファンクションのかわりに、ユーザー定義のデフォルトの選択性を使用できます。デフォルトの選択性は、0から100%の値で示され、選択性ファンクションをコールするかわりにオプティマイザに参照されます。デフォルトの選択性は、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドを含む述語に対して使用できます。

例10-19に示す関連付けでは、myFunction、比較演算子=または定数1のパラメータに関係なく、myFunction(Test_tab.col_a) = 1述語の選択性が常に20%(または0.2)になります。選択性ファンクションをコールするかわりに、このデフォルトの選択性が使用されます。

関連付けは、統計タイプまたはデフォルトの選択性のいずれか(片方のみ)を使用して宣言されます。そのため、次の文は無効です。

ASSOCIATE STATISTICS WITH FUNCTIONS myFunction USING stat_myFunction
   DEFAULT SELECTIVITY 20

デフォルトの選択性の宣言のその他の例は次のとおりです。

ASSOCIATE STATISTICS WITH PACKAGES Demo_pack DEFAULT SELECTIVITY 20
ASSOCIATE STATISTICS WITH TYPES Example_typ DEFAULT SELECTIVITY 20

例10-19 統計とデフォルトの選択性の関連付け

ASSOCIATE STATISTICS WITH FUNCTIONS myFunction DEFAULT SELECTIVITY 20

10.3.3 ユーザー定義のコスト

ユーザー定義のコスト・ファンクションを使用して、問合せの述語のコストが計算されます。述語は以前リストされた形式である必要があり、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドが含まれる場合があります。また、ユーザー定義のコスト・ファンクションはドメイン索引のコストの計算に使用されます。

10.3.3.1 ユーザー定義演算子

例10-20の関連付けは宣言される場合のuserOp(Test_tab.col_a) = 1述語を考えてみます。userOpを実装するindtype索引タイプのドメイン索引Test_indxが評価される場合は、統計タイプstat_indtype内のODCIStatsIndexCost()メソッド(存在する場合)がコールされます。このドメイン索引が使用されていない場合は、統計タイプstat_userOp内のODCIStatsFunctionCost()(存在する場合)がコールされて、演算子userOpのファンクション実装のコストが計算されます。

例10-20 統計とユーザー定義演算子の関連付け

ASSOCIATE STATISTICS WITH INDEXTYPES indtype USING stat_indtype
  WITH SYSTEM MANAGED STORAGE TABLES
ASSOCIATE STATISTICS WITH FUNCTIONS userOp USING stat_userOp_func
10.3.3.2 スタンドアロン・ファンクション

例10-21に示す関連付けがスタンドアロン・ファンクションmyFunctionに対して宣言されると、myFunction(Test_tab.col_a, 'TEST') = 1述語の統計タイプstat_myFunction内のODCIStatsFunctionCost()ファンクション(存在する場合)がコールされます。

拡張可能オプティマイザ・インタフェースで説明するように、ユーザー定義ファンクションのコストはアクセス方法の選択には影響せず、述語の順序付けにのみ使用されます。

例10-21 統計とスタンドアロン・ファンクションの関連付け

ASSOCIATE STATISTICS WITH FUNCTIONS myFunction USING stat_myFunction;
10.3.3.3 パッケージ・ファンクション

例10-22に示す関連付けがパッケージDemo_packに対して宣言されると、myDemoPackFunctionDemo_pack内のファンクションである場合にDemo_pack.myDemoPackFunction(Test_tab.col_a, 'TEST') = 1述語の統計タイプstat_Demo_pack内のODCIStatsFunctionCost() ファンクション(存在する場合)がコールされます。

例10-22 統計とパッケージ・ファンクションの関連付け

ASSOCIATE STATISTICS WITH PACKAGES Demo_pack USING stat_Demo_pack;
10.3.3.4 型メソッド

例10-23に示すように、関連付けがタイプExample_typに対して宣言されている場合、myExampleTypMethodExample_typ内のメソッドであるときにmyExampleTypMethod(Test_tab.col_b) = 1述語の統計タイプstat_Example_typ内のODCIStatsFunctionCost()ファンクション(存在する場合)がコールされます。

例10-23 統計と型メソッドの関連付け

ASSOCIATE STATISTICS WITH TYPES Example_typ USING stat_Example_typ;
10.3.3.5 デフォルトのコスト

デフォルトの選択性のように、デフォルトのコストは、ユーザー定義演算子、スタンドアロン・ファンクション、パッケージ・ファンクションまたは型のメソッドを持つ述語で使用できます。例10-24に示すコマンドは、userOpのパラメータ、比較演算子=または定数1に関係なく、ドメイン索引Test_indxを使用したuserOp(Test_tab.col_a) = 1述語の実装に100のCPUコスト、5のI/Oコストおよび0のネットワーク・コスト(ネットワーク・コストは無視されます)が常に生じることを宣言します。ODCIStatsIndexCost()ファンクションをコールするかわりにこのデフォルトのコストが使用されます。

ユーザーは統計タイプまたはデフォルトの選択性のいずれか(片方のみ)を使用して関連付けを宣言できます。そのため、次の文は無効です。

ASSOCIATE STATISTICS WITH INDEXES Test_indx USING stat_Test_indx
   DEFAULT COST (100, 5, 0)

デフォルトのコストの宣言のその他の例は次のとおりです。

ASSOCIATE STATISTICS WITH FUNCTIONS myFunction DEFAULT COST (100, 5, 0)
ASSOCIATE STATISTICS WITH PACKAGES Demo_pack DEFAULT COST (100, 5, 0)
ASSOCIATE STATISTICS WITH TYPES Example_typ DEFAULT COST (100, 5, 0)
ASSOCIATE STATISTICS WITH INDEXTYPES indtype DEFAULT COST (100, 5, 0)

例10-24 統計とデフォルトのコストの関連付け

ASSOCIATE STATISTICS WITH INDEXES Test_indx DEFAULT COST (100, 5, 0);

10.3.4 索引または列のNULL関連の宣言

索引タイプまたはオブジェクト型に定義されている統計タイプの関連付けは、索引タイプの索引インスタンスおよびオブジェクト型の列によって継承されます。継承された関連付けは、索引インスタンスまたは列の異なる関連付けを明示的に定義して上書きできますが、関連付けがまったくない索引または列を使用すると上書きされる場合があります。たとえば、より有効なのは、特定の問合せに関して、コストまたは選択性ファンクションの起動によって発生する追加のコンパイル時間を上回らないようにすることです。このような場合、例10-25のように、ASSOCIATEコマンドを使用して列または索引のNULL関連付けを宣言できます。

NULL関連が指定される場合、スキーマ・オブジェクトは列型または索引タイプの統計タイプを継承しません。また、NULL関連はデフォルト値も除外します。

例10-25 列および索引に対するNULLの統計の関連付けの宣言

ASSOCIATE STATISTICS WITH COLUMNS columns NULL;
ASSOCIATE STATISTICS WITH INDEXES indexes NULL;

10.3.5 DDL操作が統計に与える影響

パーティション・レベルの集計統計およびスキーマ・オブジェクト・レベルの集計統計は、標準統計と同じようにDDL操作に影響します。表10-2に、影響の概要を示します。

表10-2 DDLのパーティションおよび全体統計への影響

操作 パーティション統計への影響 全体統計への影響
ADD PARTITION

なし。

処置は不要です。

COALESCE PARTITION

統計は削除されます。

統計は再計算されます(_minimal_stats_aggregationFALSEの場合。それ以外は影響なし)。

DROP PARTITION

統計は削除されます。

統計は再計算されます(_minimal_stats_aggregationFALSEの場合。それ以外は影響なし)。

SPLIT PARTITION

統計は削除されます。

なし。

MERGE PARTITION

統計は削除されます。

なし。

TRUNCATE PARTITION

統計は削除されます。

なし。

EXCHANGE PARTITION

統計は削除されます。

統計は再計算されます(_minimal_stats_aggregationFALSEの場合。それ以外は影響なし)。

REBUILD PARTITION

なし。

なし。

MOVE PARTITION

なし。

なし。

RENAME PARTITION

なし。

なし。

既存のパーティションが実行またはALTER TABLE DROP PARTITION文を使用して削除され、_minimal_stats_aggregationパラメータがFALSEに設定される場合、パーティションの統計は削除され、表または索引の集計統計が計算されます。

10.4 述語の順序付け

ORDERED_PREDICATESヒントがない場合、述語(索引キーで使用されている場合を除く)は次のルールで指定された順序で評価されます。

  • WHERE句で指定された順序では、ユーザー定義関数、型のメソッドまたは副問合せを含まない述語が最初に評価されます。

  • ユーザー計算によるコストを含むユーザー定義関数および型のメソッドのある述語は、コストの増加順に評価されます。

  • WHERE句で指定された順序では、ユーザー計算によるコストを含まないユーザー定義関数および型のメソッドのある述語が、その次に評価されます。

  • WHERE句に指定されていない述語(オプティマイザで他動詞的に生成された述語など)が、その次に評価されます。

  • WHERE句で指定された順序では、副問合せを含む述語が最後に評価されます。

10.5 依存性モデル

依存性モデルは、表10-3に示すように、SQLコマンドが発行されると実行されるアクションに反映されます。

表10-3 DDLの依存性モデル

コマンド アクション
DROP statistics_type 

関連付けがstatistics_typeで定義されている場合、コマンドは失敗します。それ以外の場合は型が削除されます。

DROP statistics_type FORCE

statistics_typeに関連付けられているすべてのオブジェクトのDISASSOCIATE FORCEがコールされ、statistics_typeは削除されます。

DROP object

DISASSOCIATEがコールされ、DISASSOCIATEが成功した場合はobject_typeが削除されます。

ALTER TABLE DROP COLUMN

列に関連付けが存在する場合は、列でDISASSOCIATE FORCEがコールされます。ASSOCIATION$にエントリがなく、型USATS$にエントリがある場合、列に対してODCIStatsDelete()が起動されます。

DISASSOCIATE

statistics_typeで収集されたユーザー定義統計が存在する場合、コマンドは失敗します。

DISASSOCIATE FORCE

ASSOCIATION$のエントリは削除され、ODCIStatsDelete()がコールされます。

DBMS_STATISTICSパッケージを使用して索引統計が削除されます。

ODCIStatsDelete()ファンクションが起動され、エラーが発生した場合は、統計の削除が失敗してエラーが報告されます。

ASSOCIATE

関連するオブジェクトに関連付けまたはユーザー定義統計が存在する場合、コマンドは失敗します。

関連項目:

ODCIStatsDelete()

10.6 制限事項と提案事項

統計タイプは標準のオブジェクト型です。オブジェクト型には1つ以上の属性が必要なため、統計タイプにも1つ以上の属性が必要です。ただし、ダミー属性のため、設定またはアクセスされることはありません。

10.6.1 分散実行

Oracleの分散実装では、ファンクションのリモート機能リストへの追加はサポートされません。リモート表を参照しているすべてのファンクションはフィルタとして実行されます。フィルタの配置はオプティマイザでは発生しません。コスト・モデルによってこの実装が反映され、これらの述語の配置が最適化されます。

述語を他の表へ移すことはできないため、リモート表でドメイン索引は使用できません。そのため、DESCRIBEプロトコルは変更されず、リモート・ドメイン索引はローカルでは参照できません。

10.6.2 システム管理記憶域表および関連統計

索引タイプWITH SYSTEM MANAGED STORAGE TABLESを作成する場合は、関連する統計タイプWITH SYSTEM MANAGED STORAGE TABLESも作成する必要があります。システム・パーティション表を使用してローカル索引列で統計を収集する場合は、Oracleサーバーでパーティション・メンテナンス操作時にシステム・パーティション統計表が保持されます。索引タイプが統計タイプに関連付けられている場合はWITH SYSTEM MANAGED STORAGE TABLESオプションを使用できますが、それ以外の場合はエラーになります。

10.6.3 オブジェクト・レベル統計の集計

ローカル索引を使用する場合、パーティション・レベル統計および集計オブジェクト・レベル統計の両方の保持に有効です。パーティション・メンテナンス操作時に、パーティション・レベル統計は削除されますが、集計オブジェクト・レベル統計は、操作に反映するか、後で再計算するためにそのままにして調整します。

集計統計の調整または再計算は、サーバーの_minimal_stats_aggregationパラメータに基づいて決定します。パラメータがFALSEの場合は、集計統計が再計算されます。パラメータがTRUEの場合は、統計が再計算されません。

10.6.4 システム管理ドメイン索引付け

システム管理ドメイン索引付けアプローチでは、索引タイプに関連付けられているシステム管理統計がサポートされており、索引タイプ自体もシステム管理されています。

10.6.5 パフォーマンス

同じ計画が選択されている場合、問合せの実行のコストは拡張可能オプティマイザと同じままです。異なる計画が選択されている場合、実行時にユーザー定義コスト、選択性および統計収集ファンクションが正確に見積もられます。デフォルトでは正確に見積もられず、実行計画のコストが非常に大きくなる可能性があるため、これを考慮してユーザー定義構造の統計収集、選択性およびコスト・ファンクションを提供することを強くお薦めします。