ヘッダーをスキップ
Oracle Databaseルール・マネージャおよび式フィルタ開発者ガイド
11gリリース1(11.1)
E05697-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

16 SQLの演算子と文

この章では、式データの索引付けに使用するSQLのEVALUATE演算子およびSQL文のリファレンス情報を提供します。表16-1に、文とその説明を示します。SQL文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

表16-1 式フィルタ索引の作成および使用文

説明

EVALUATE


式セットを指定のデータ項目またはデータ項目の表と照合します。

ALTER INDEX REBUILD


式フィルタ索引を再作成します。

ALTER INDEX RENAME TO


式フィルタ索引の名前を変更します。

CREATE INDEX


式を格納する列に式フィルタ索引を作成します。

DROP INDEX


式フィルタ索引を削除します。



EVALUATE

EVALUATE演算子をSQL文のWHERE句に使用して、格納されている式を受け取ったデータ項目と比較します。

評価する式はExpression列に格納されます。このExpression列は、ユーザー表のVARCHAR2列に属性セットを割り当てて作成します。

書式

EVALUATE (expression_column, <dataitem>)

<dataitem> := <varchar_dataitem> | <anydata_dataitem>
<varchar_dataitem> := attribute_name => attribute_value
                      {, attribute_name => attribute_value}
<anydata_dataitem> := AnyData.convertObject(attribute_set_instance)

キーワードとパラメータ

expression_column

式を格納する列の名前。

attribute_name

対応する属性セットからの属性の名前。

attribute_value

属性の値。

attribute_set_instance

対応する属性セットに関連したオブジェクト型のインスタンス。

戻り値

EVALUATE演算子は、データ項目と一致する式については1を、一致しない式については0を戻します。Expression列に格納されているNULL値の場合、EVALUATE演算子はNULLを戻します。

使用上の注意

EVALUATE演算子はSQL文のWHERE句に使用できます。式を格納する列に式フィルタ索引が定義されている場合、その列のEVALUATE演算子は使用コストに基づいて式セットの評価に索引を使用できます。EVALUATE演算子は、式の格納表とそれに対応するデータ項目の格納表の間の結合述語として使用できます。

属性セット内のすべての要素属性の値を読取り可能な値(VARCHARDATEおよびNUMBERデータ型に格納されている値など)として表すことができ、コンストラクタが文字列形式の場合は、データ項目を属性の名前/値ペアの文字列として書式指定できます。データ項目の要素属性値のいずれにもコンストラクタが不要な場合は、その属性セットに関連付けられているオブジェクト型の2つのgetVarcharメソッド(STATICメソッドとMEMBERメソッド)を使用して、データ項目について提供する値リストを名前/値ペアの文字列形式で指定できます。

AnyDataインスタンスを使用すると、任意のデータ項目を書式設定できます。1つ以上のバイナリ型属性を含む属性セットには、AnyData形式のデータ項目を使用する必要があります。

EVALUATE演算子の詳細は、第11.3項を参照してください。

関連ビュー: USER_EXPFIL_ATTRIBUTE_SETSUSER_EXPFIL_ATTRIBUTESおよびUSER_EXPFIL_EXPRESSION_SETS

次の問合せでは、getVarchar()関数により生成されたVARCHAR形式のデータ項目を使用しています。

SELECT * FROM Consumer WHERE
    EVALUATE (Consumer.Interest,
               Car4Sale('Mustang',
                         2000,
                         18000,
                         22000).getVarchar()
               ) = 1;

この問合せでは、次の構文を使用してデータ項目をAnyData形式で渡すことができます。

SELECT * FROM Consumer WHERE
    EVALUATE (Consumer.Interest,
              AnyData.convertObject (
                      Car4Sale ('Mustang',
                                 2000,
                                 18000,
                                 22000)
              )) = 1;

表に大きいデータ項目セットが格納されている場合は、次の構文を使用して、式の格納表をデータ項目の格納表と結合できます。

SELECT i.CarId, c.CId, c.Phone
FROM Consumer c, Inventory i
WHERE
     EVALUATE (c.Interest,
               Car4Sale(i.Model, i.Year, i.Price, i.Mileage).getVarchar()) = 1
ORDER BY i.CarId;

ALTER INDEX REBUILD

ALTER INDEX REBUILD文は、式の格納列に作成された式フィルタ索引を再作成します。再作成操作が正常終了するには、USER_INDEXESビューで式フィルタ索引のDOMIDX_OPSTATUSステータスがVALIDである必要があります。

書式

ALTER INDEX [schema_name.]index_name REBUILD
 [PARAMETERS ('DEFAULT')]

キーワードとパラメータ

DEFAULT

再作成する式フィルタ索引のストアド属性と索引付き属性のリストは、対応する属性セットに関連付けられたデフォルトの索引パラメータから導出されます。

使用上の注意

PARAMETERS句を指定せずにALTER INDEX...REBUILD文を発行すると、式フィルタ索引の再作成にはストアド属性と索引付き属性の現行リストが使用されます。また、この文は、依存オブジェクトの欠落が原因でIMPORT操作中に失敗した索引にも使用できます。

属性セットに関連付けられているデフォルトの索引パラメータは、既存の式フィルタ索引に影響を与えずに変更できます。ALTER INDEX...REBUILD文にDEFAULTパラメータを使用すると、これらの索引を再作成して新規のデフォルト・セットを使用できます。デフォルトを使用して索引を再作成すると、式セットに割り当てられていた索引パラメータが消去されます。

式フィルタ索引の索引付き属性に対して定義されていたビットマップ索引は、対応する列に格納されている式が頻繁に(INSERTUPDATEまたはDELETE操作を使用して)変更されると断片化されます。この種の索引を再作成すると、EVALUATE演算子を使用した問合せのパフォーマンスを改善できます。DBMS_EXPFIL.DEFRAG_INDEXプロシージャを使用すると、ビットマップ索引をオンラインで再作成できます。

索引の再作成の詳細は、第12.8項を参照してください。

関連ビュー: USER_EXPFIL_INDEXESおよびUSER_EXPFIL_PREDTAB_ATTRIBUTES

次の文では、現行のパラメータを使用して索引が再作成されます。

ALTER INDEX InterestIndex REBUILD;

次の文では、対応する属性セットに関連したデフォルトの索引パラメータを使用して索引が再作成されます。

ALTER INDEX InterestIndex REBUILD PARAMETERS('DEFAULT');

ALTER INDEX RENAME TO

ALTER INDEX RENAME TO文は、式フィルタ索引の名前を変更します。

書式

ALTER INDEX [schema_name.]index_name RENAME TO new_index_name;

キーワードとパラメータ

なし

使用上の注意

なし

次の文では、索引名が変更されます。

ALTER INDEX InterestIndex RENAME TO ExprIndex;

CREATE INDEX

CREATE INDEX文は、列に格納されている式セットに対する式フィルタ索引を作成します。索引付けの対象となる列は(属性セットを割当て済の)式を格納するように構成し、表(式を格納)と同じスキーマに索引を作成する必要があります。

書式

CREATE INDEX [schema_name.]index_name ON
[schema_name.].table_name (column_name) INDEXTYPE IS EXFSYS.EXPFILTER
[ PARAMETERS (' <parameters_clause> ' ) ...;
<parameters_clause>:= [ADD TO DEFAULTS | REPLACE DEFAULTS]
             [<storeattrs_clause>] [<indexattrs_clause>][<predstorage_clause>]
<storeattrs_clause>  :=  STOREATTRS [ ( attr1, attr2, ..., attrx   ) | TOP n ]
<indexattrs_clause>  :=  INDEXATTRS [ ( attr1, attr2, ..., attry   ) | TOP m ]
<predstorage_clause> := PREDSTORAGE (<storage_clause>)

キーワードとパラメータ

EXFSYS.EXPFILTER

式フィルタ索引を実装する索引タイプの名前。

ADD TO DEFAULTS

このパラメータを指定すると、STOREATTRS句とINDEXATTRS句に指定した属性が、対応する属性セットに関連したデフォルトに追加されます。これはデフォルトの動作です。

REPLACE DEFAULTS

このパラメータを指定すると、この句の後に指定したストアド属性と索引属性のリストのみを使用して索引が作成されます。この場合、対応する属性セットに関連付けられているデフォルトの索引パラメータは無視されます。

STOREATTRS

式フィルタ索引のストアド属性をリストします。

INDEXATTRS

式フィルタ索引の索引付き属性をリストします。

TOP

このパラメータは、式セットの統計が収集される場合にのみ、STOREATTRS句とINDEXATTRS句の両方に使用できます。(GET_EXPRSET_STATSプロシージャの項を参照。)TOPパラメータに続く数値は、式フィルタ索引用に格納または索引付けされる(最も頻度の高い)属性の数を示します。

PREDSTORAGE

述語表のSTORAGE句。<storage_clause>の定義は、『Oracle Database SQL言語リファレンス』を参照してください。

使用上の注意

式セット(式の格納列)に索引パラメータを直接割り当てると、CREATE INDEX文のPARAMETERS句ではSTOREATTRS句またはINDEXATTRS句を使用できません。この場合、式フィルタ索引は常に、式セットに関連付けられたパラメータを使用して作成されます。(第18章INDEX_PARAMETERSプロシージャとXPINDEX_PARAMETERSプロシージャに関する各項および第19章USER_EXPFIL_INDEX_PARAMSビューに関する項を参照。)

CREATE INDEX文にPARAMETERS句を使用せず、式セットに索引パラメータを割り当てなければ、式フィルタ索引には対応する属性セットに関連付けられているデフォルトの索引パラメータが使用されます。デフォルトの索引パラメータ・リストが空の場合、属性セットに定義されたスカラー属性はすべて述語表に格納されて索引付けされます。

式フィルタ索引の場合は、すべての索引付き属性も格納されます。そのため、ストアド属性のリストは、STOREATTRS句に指定した属性とINDEXATTRS句に指定した属性から導出されます。REPLACE DEFAULTS句を指定しなければ、このリストは対応する属性セットに関連付けられているデフォルトの索引パラメータとマージされます。

REPLACE DEFAULTS句を指定しなければ、式フィルタ索引用の索引付き属性のリストはINDEXATTRS句および対応する属性セットに関連したデフォルトの索引パラメータから導出されます。このリストが空の場合は、最大10個のストアド属性が選択されて索引付けされます。

ある属性がPARAMETERS句とデフォルトの索引パラメータにリストされている場合、そのストアド・プロパティと索引付きプロパティはPARAMETERS句の指定により決定されます。

式セットの述語統計では、CREATE INDEX文のパラメータでTOP句を使用可能にする必要があります。(詳細は、「GET_EXPRSET_STATSプロシージャ」を参照。)STOREATTRSパラメータにTOP句を使用する場合は、INDEXATTRSパラメータ(指定する場合)でもTOP句を使用する必要があります。また、INDEXATTRSパラメータのTOP句には、STOREATTRSパラメータに指定した値以下の数値を指定する必要があります。TOP句を使用すると、暗黙的にREPLACE DEFAULTSが使用されます。つまり、ストアド属性と索引付き属性は、ディクショナリ内で使用可能な述語統計のみに基づいて選択されます。

式フィルタ索引を正常に作成すると、述語表、述語表の1つ以上のビットマップ索引、アクセス関数を含むパッケージが、ベース表と同じスキーマに作成されます。デフォルトでは、述語表とその索引はユーザーのデフォルト表領域に作成されます。PREDSTORAGE句を使用すると、述語表に使用する代替表領域と他の記憶域パラメータを指定できます。述語表の索引は、常にその表と同じ表領域に作成されます。

式の索引付けの詳細は、第12章を参照してください。

関連ビュー: USER_EXPFIL_INDEXESUSER_EXPFIL_INDEX_PARAMETERSUSER_EXPFIL_DEF_INDEX_PARAMSUSER_EXPFIL_EXPRSET_STATSおよびUSER_EXPFIL_PREDTAB_ATTRIBUTES

式セットに索引パラメータを直接割り当てない場合は、次のように、対応する属性セットに指定されているデフォルトの索引パラメータを使用して式フィルタ索引を作成できます。

CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER;

次の文を使用すると、ストアド属性を1つ追加して索引を作成できます。

CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER
  PARAMETERS ('STOREATTRS (CrashTestRating(Model, Year))
               PREDSTORAGE (tablespace tbs_1) ');

次の文を使用すると、索引のストアド属性と索引付き属性の完全リストを指定できます。

CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER
  PARAMETERS ('REPLACE DEFAULTS
               STOREATTRS (Model, CrashTestRating(Model, Year))
               INDEXATTRS (Model, Year, Price)
               PREDSTORAGE (tablespace tbs_1) ');

式セットの統計の計算時には、PARAMETERS句でTOP句を使用できます。これらの統計には、USER_EXPFIL_EXPRSET_STATSビューからアクセスできます。

BEGIN
  DBMS_EXPFIL.GET_EXPRSET_STATS (expr_tab => 'Consumer',
                                 expr_col => 'Interest');
END;
/

CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER
  PARAMETERS ('STOREATTRS TOP 4 INDEXATTRS TOP 3');

DROP INDEX

DROP INDEX文は、式フィルタ索引を削除します。

書式

DROP INDEX [schema_name.]index_name;

キーワードとパラメータ

なし

使用上の注意

式フィルタ索引を削除すると、その索引に関してメンテナンスされているセカンダリ・オブジェクトがすべて自動的に削除されます。これらのオブジェクトには、述語表、述語表の1つ以上の索引およびアクセス関数パッケージが含まれます。

DROP INDEX InterestIndex;