DB2 ユニバーサル・データベースでは、ユーザー定義の索引タイプをサポートするため、 索引がどのように機能するかを制御する主な構成要素の論理を、独自に作成して適用できます。 この種の置換可能な構成要素には、以下のものが含まれます。
注: | ユーザー定義関数の定義は決定的でなければならず、 外部アクションを許可して、最適化プログラムから活用できるようにしてはなりません。 |
オプションでデータ・フィルター関数も指定できます。 最適化プログラムは、 取り出されたタプルに対してフィルターを使用してから、 ユーザー定義関数を評価します。
構造型または特殊タイプの列に限り、索引の拡張を使用して、 これらのオブジェクトに対してユーザー定義の拡張型タイプを作成できます。 ユーザー定義の拡張索引タイプには以下のことは行えません。
CREATE INDEX EXTENSION ステートメントを使用して、 索引の操作を制御する 2 つの構成要素を定義できます。
索引の保守とは、 索引列の内容 (またはソース・キー) をターゲットの索引キーに変換するプロセスのことです。 変換プロセスは、 データベースに事前定義された表関数を使用して定義されます。
FROM SOURCE KEY 文節は、 この索引の拡張でサポートされるソース・キー列のタイプを、 構造型データ・タイプまたは特殊タイプとして指定します。 パラメーター名とデータ・タイプを 1 つずつ指定して、 それらをソース・キー列と関連付けます。
GENERATE KEY USING 文節は、 索引キーの生成に使用されるユーザー定義表関数を指定します。 この関数からの出力の指定は、 TARGET KEY 文節の指定の中で行わなければなりません (下記参照)。 この関数からの出力を、 FILTER USING 文節で指定される索引フィルター関数の入力として使用することもできます。
索引の検索は、検索引き数を検索範囲にマップします。
WITH TARGET KEY 文節は、ターゲット・キー・パラメーターを指定します。 このパラメーターは、GENERATE KEY USING 文節に指定されるキー生成関数の出力です。 パラメーター名とデータ・タイプを 1 つずつ指定して、 それらをターゲット・キー列と関連付けます。 このパラメーターは、 GENERATE KEY USING 文節のユーザー定義表関数の RETURNS 表の列に対応します。
SEARCH METHODS 文節は、 索引の検索の方式を 1 つまたは複数定義します。 検索の方式はそれぞれ、方式名、検索引き数、範囲作成関数、 およびオプションの索引フィルター関数から成ります。 検索の方式はそれぞれ、ユーザー定義表関数が、 基礎となるユーザー定義索引の索引検索範囲をどのように作成するかを定義します。 さらに、検索の方式はそれぞれ、特定の検索範囲にある索引項目を、 ユーザー定義のスカラー関数がさらに限定する方法も定義します。
索引活用は、検索の方式の評価時に生じます。
CREATE FUNCTION (外部スカラー) ステートメントは、 索引の拡張のために定義された検索の方式と共に使用される、 ユーザー定義の述部を作成します。
PREDICATES 文節は、この関数が使用されている述部、 つまり索引の拡張を活用する可能性のある (および検索条件のためにオプションの SELECTIVITY 文節を使用する可能性のある) 述部を識別します。 PREDICATES 述部を指定する場合は、NO EXTERNAL ACTION を指定して、 関数を DETERMINISTIC として定義しなければなりません。
索引の拡張の定義のシナリオを以下に示します。
CREATE INDEX EXTENSION iename (parm_name datatype, ...) FROM SOURCE KEY (parm_name datatype) GENERATE KEY USING table_function_invocation ...
FROM SOURCE KEY 文節は、 キー変換のパラメーターとデータ・タイプを識別します。 GENERATE KEY USING 文節は、 自分が生成した値とソース・キーとをマップする関数を識別します。
CREATE INDEX EXTENSION iename (parm_name datatype, ...) ... WITH TARGET KEY WHEN method_name (parm_name datatype, ...) RANGE THROUGH range_producing_function_invocation FILTER USING index_filtering_function_invocation
WITH TARGET KEY 文節は、検索の方式の定義を識別します。 WHEN 文節は、方式名を識別します。 RANGE THROUGH 文節は、 使用される索引の効力範囲を制限するのに使用される関数を識別します。 FILTER USING 文節は、 結果の索引値から不要な項目を除去するのに使用される関数を識別します。
注: | FILTER USING 文節は、 索引フィルター処理関数の代わりに case 式を識別することもできます。 |
CREATE FUNCTION within (x shape, y shape) RETURNS INTEGER ... PREDICATES WHEN = 1 FILTER USING mbrWithin (x..mbr..xmin, ...) SEARCH BY INDEX EXTENSION grid_extension WHEN KEY (parm_name) USE method_name(parm_name)
PREDICATES 文節の後ろには、1 つまたは複数の述部が続きます。 それぞれの述部は、WHEN 文節で始まります。 WHEN 文節は、比較演算子とその後に続く定数または EXPRESSION AS 文節で始まり、 その後に述部の指定が続きます。 FILTER USING 文節は、 結果表に追加のフィルター処理を実行するために使用できるフィルター関数を識別します。 これは、定義される関数 (述部で使用される関数) に代わる、より費用の低い関数です。 適格な行を判別するためにユーザー定義の述部を実行しなければならない行数を削減します。 SEARCH BY INDEX EXTENSION 文節は、索引活用を実行する場所を指定します。 索引活用は、索引を活用するために使用できる索引の拡張の検索の方式を使用して、 一連の規則を定義します。 WHEN KEY 文節は、活用の規則を指定します。 活用の規則として、検索ターゲット、検索引き数、 および検索の方式を使用して索引検索を実行する際の使用法を記述できます。
CREATE FUNCTION mbrWithin (...)ここで定義されている関数は、 索引の拡張の述部で使用するために作成されます。
照会のパフォーマンスを向上するために作成した索引が、 照会最適化プログラムにより正常に活用されるようにするため、 関数呼び出しに SELECTIVITY オプションを使用できます。 述部によって戻される行のパーセンテージを指定したい場合は、 関数呼び出しに SELECTIVITY オプションを使用して、 DB2 最適化プログラムが有効なアクセス・パスを選択するようにすることができます。
以下の例で、 within ユーザー定義関数は中心と半径を (中心は 1 つ目のパラメーターに基づいて、 半径は 2 つ目のパラメーターに基づいて) 計算し、 該当する選択率でステートメントのストリングを構築します。
SELECT * FROM customer WHERE within(loc, circle(100, 100, 10) = 1 SELECTIVITY .05
この例に示されている述部 (SELECTIVITY .05) は、 customer 表の行のうち 95 パーセントをフィルター処理します。