用途
CREATE
INDEX
文を使用すると、次のものに索引を作成できます。
表の1つ以上の列、パーティション表、索引構成表またはクラスタ
表またはクラスタの1つ以上のスカラー型オブジェクト属性
ネストした表の列の索引を作成するためのネストした表の記憶表
索引は、表またはクラスタの索引列に表示されるそれぞれの値のエントリが含まれるスキーマ・オブジェクトであり、行に対する直接かつ高速のアクセスを提供します。Oracle Databaseは次のタイプの索引をサポートしています。
通常の索引。(デフォルトではBツリー索引が作成されます。)
ビットマップ索引。キー値に関連付けられたROWIDをビットマップとして格納します。
パーティション索引。表の索引付き列に表示される各値のエントリを含むパーティションで構成されます。
ファンクション索引。式をベースとしています。式によって戻される値を評価する問合せを構成できます。その式には、組込みファンクションまたはユーザー定義ファンクションを含めることができます。
前提条件
自分のスキーマ内に索引を作成する場合は、次のいずれかの条件が満たされている必要があります。
索引を作成する表またはクラスタが自分のスキーマ内に定義されている。
索引を作成する表に対するINDEX
オブジェクト権限を持っている。
CREATE
ANY
INDEX
システム権限を持っている。
他のユーザーのスキーマ内に索引を作成する場合は、CREATE
ANY
INDEX
システム権限が必要です。また、索引が定義されているスキーマの所有者には、UNLIMITED
TABLESPACE
システム権限、あるいはその索引または索引パーティションを格納するための表領域の割当て制限のいずれかが必要です。
自分のスキーマにドメイン索引を作成する場合、従来索引の作成の前提条件の他に、索引タイプに対するEXECUTE
オブジェクト権限が必要です。他のユーザーのスキーマにドメイン索引を作成する場合、索引の所有者にも索引タイプおよびその基礎となる実装タイプに対するEXECUTE
オブジェクト権限が必要です。ドメイン索引を作成する前に、索引タイプを定義する必要があります。
ファンクション索引を作成する場合は、従来索引の作成の前提条件の他に、索引がユーザー定義ファンクションに基づいている場合は、ファンクションにDETERMINISTIC
のマークを付ける必要があります。また、これらのファンクションが他のユーザーに所有されている場合、ファンクション索引で使用されるユーザー定義ファンクションに対する、EXECUTE
オブジェクト権限を持っている必要があります。
構文
create_index::=
(index_attributes::=を参照)
(index_properties::=を参照)
(local_partitioned_index ::=、index_attributes::=を参照)
index_expr::=
index_properties::=
(global_partitioned_index::=、local_partitioned_index ::=、index_attributes::=、domain_index_clause ::=、XMLIndex_clause::=を参照)
(physical_attributes_clause ::=、logging_clause::=、key_compression::=、parallel_clause::=を参照)
(storage_clause::=を参照)
(parallel_clause ::=を参照)
(XMLIndex_parameters_clause
については、『Oracle XML DB開発者ガイド』を参照してください。)
local_XMLIndex_clause::=
(index_partitioning_clause::=、individual_hash_partitions::=、hash_partitions_by_quantity::=を参照)
individual_hash_partitions::=
(partitioning_storage_clause::=を参照)
partitioning_storage_clause::=
LOB_partitioning_storage::=
hash_partitions_by_quantity::=
index_partitioning_clause::=
(segment_attributes_clause::=を参照)
(on_range_partitioned_table ::=、on_list_partitioned_table::=、on_hash_partitioned_table ::=、on_comp_partitioned_table ::=を参照)
(segment_attributes_clause::=を参照)
(segment_attributes_clause::=を参照)
segment_attributes_clause::=
(physical_attributes_clause ::=、logging_clause::=を参照)
(segment_attributes_clause::=、index_subpartition_clause::=を参照)
parallel_clause::=
(storage_clause::=を参照)
セマンティクス
UNIQUE
を指定すると、索引のベースとなっている列の値が一意である必要があることを指定できます。
一意索引の制限事項: 一意索引には、次の制限事項があります。
UNIQUE
およびBITMAP
は同時に指定できません。
ドメイン索引にはUNIQUE
を指定できません。
BITMAP
を指定すると、index
が各行を分割した索引付けではなく、各個別キーのビットマップで作成されることを指定できます。ビットマップ索引では、キー値にビットマップとして関連付けられたROWIDが格納されます。ビットマップ内の各ビットは、使用可能なROWIDに対応しています。ビットが設定されていれば、それに対応するROWIDを持つ行に、キー値が設定されていることになります。ビットマップの内部表現は、データ・ウェアハウスなど、低レベルの同時実行トランザクションが実行されるアプリケーションに最適です。
注意: Oracleでは、すべてのキー列がNULLの表の行には索引を付けません(ただし、ビットマップ索引の場合を除きます)。したがって、表のすべての行に索引を作成する場合、索引のキー列にNOT NULL 制約を指定するか、またはビットマップ索引を作成する必要があります。 |
ビットマップ索引の制限事項: ビットマップ索引には、次の制限事項があります。
グローバル・パーティション索引の作成にはBITMAP
を指定できません。
索引構成表がビットマップ化した2次索引に対応するマッピング表を持たない場合、索引構成表にビットマップ化した2次索引を作成できません。
UNIQUE
およびBITMAP
は同時に指定できません。
ドメイン索引にはBITMAP
を指定できません。
ビットマップ索引には最大30列を指定できます。
関連項目:
|
schema
索引を作成するスキーマを指定します。schema
を指定しない場合、自分のスキーマ内に索引が作成されます。
index
作成する索引の名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
cluster_index_clause
を使用すると、クラスタ索引を作成するクラスタを指定できます。clusterをschema
で修飾しない場合、そのクラスタは自分のスキーマ内にあるとみなされます。ハッシュ・クラスタにはクラスタ索引を作成できません。
索引を定義する表を指定します。table
をschema
で修飾しない場合、その表は自分のスキーマにあるとみなされます。
ネストした表の記憶表に索引を作成することによって、ネストした表の列に索引を作成します。記憶表のNESTED_TABLE_ID
疑似列を組み込んだ一意索引を作成することは、ネストした表の値を持つ行がそれぞれ確実に異なるようにする有効な手段です。
セッションがバインドされていない場合にのみ、一時表でDDL操作(ALTER
TABLE
、DROP
TABLE
、CREATE
INDEX
など)を実行できます。セッションを一時表にバインドするには、一時表でINSERT
操作を実行します。セッションを一時表からアンバインドするには、TRUNCATE
文を発行するか、セッションを終了します。また、トランザクション固有の一時表からアンバインドするには、COMMIT
またはROLLBACK
文を発行します。
table_index_clauseの制限事項: この句には、次の制限事項があります。
index
がローカル・パーティション索引の場合は、table
をパーティション化する必要があります。
table
が索引構成表の場合、この文は2次索引を作成します。この索引には、索引構成表の索引キーおよび論理ROWIDが含まれます。論理ROWIDは、索引キーにも含まれる列を除外します。この2次索引には、REVERSE
を指定できません。索引キーおよび論理ROWIDの結合サイズは、ブロック・サイズ未満にする必要があります。
table
が一時表の場合、index
もtable
と同様の有効範囲(セッションまたはトランザクション)を持つ一時的なものとなります。一時表の索引には、次の制限があります。
index_properties
で指定できるのは、index_attributes
の部分のみです。
index_attributes
では、physical_attributes_clause
、parallel_clause
、logging_clause
またはTABLESPACE
を指定できません。
一時表には、ドメイン索引またはパーティション索引は作成できません。
外部表に索引を作成することはできません。
索引を作成する表に対して相関名(別名)を指定します。
注意: index_expr がオブジェクト型属性またはオブジェクト型メソッドを参照する場合、この別名が必要になります。「型メソッドのファンクション索引の作成例:」および「置換可能な列の索引の作成例:」を参照してください。 |
index_expr
では、索引のベースとなる列または列式を指定します。
column 表内の1つ以上の列の名前を指定します。ビットマップ索引には最大30列を指定できます。他の索引には最大32列を指定できます。これらの列は索引キーを定義します。
一意索引がローカル非同一キー索引(「local_partitioned_index」を参照)の場合、索引キーはパーティション・キーを含んでいる必要があります。
関連項目: 同一キー索引および非同一キー索引の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。 |
スカラー・オブジェクト属性列またはネストした表の記憶表のシステム定義のNESTED_TABLE_ID
列には索引を作成できます。オブジェクト属性列を指定する場合、列名を表名で修飾する必要があります。ネストした表の列属性を指定する場合は、この属性は、一番外側の表の名前、ネストした表が定義されている列の名前、およびそのネストした表の列属性となるすべての中間属性の名前で修飾する必要があります。
索引列の制限事項 索引列には、次の制限事項があります。
Oracle Databaseでサポートされている、SCOPE
句で定義したREF
型の列または属性の索引を除き、ユーザー定義型、LONG
、LONG
RAW
、LOBまたはREF
型の列または属性に索引を作成できません。
暗号化された列には、標準の(Bツリー)索引しか作成できません。これらの索引は、等価検索にのみ使用できます。
column_expression table
の列、定数、SQLファンクションおよびユーザー定義ファンクションから作成された式を指定します。column_expression
を指定した場合、ファンクション索引が作成されます。
ファンクションの名前解決は、索引作成者のスキーマに基づきます。column_expression
で使用されるユーザー定義ファンクションは、CREATE
INDEX
操作中に完全に名前解決されます。
ファンクション索引の作成後、DBMS_STATS
パッケージを使用して、索引と実表の両方に関する統計情報を収集します。これらの統計情報によって、Oracle Databaseは索引を使用するタイミングを正しく判断できます。
ファンクションの一意索引は、列または列の組合せに対して条件付きの一意制約を定義する場合に便利なことがあります。例については、「ファンクション索引の使用による条件付き一意性の定義例:」を参照してください。
関連項目: DBMS_STATS パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。 |
ファンクション索引の注意事項: ファンクション索引には、次の注意事項があります。
ファンクション索引を使用する表を後で問い合せる場合、問合せでNULLが除外されないかぎり索引は使用されません。ただし、WHERE
句に指定した列の順序が、ファンクション索引を定義したcolumn_expression
での順序と異なる場合でも、問合せにファンクション索引が使用されます。
索引のベースになるファンクションが無効であるか、または削除された場合は、索引にDISABLED
のマークが付けられます。オプティマイザが索引の使用を選択した場合、DISABLED
索引の問合せは失敗します。索引にUNUSABLE
のマークも付けて、パラメータSKIP_UNUSABLE_INDEXES
をtrue
に設定しないかぎり、DISABLED
索引のDML操作は失敗します。このパラメータの詳細は、「ALTER SESSION」を参照してください。
ファンクション、パッケージまたは型のパブリック・シノニムがcolumn_expression
で使用され、後で同じ名前の実際のオブジェクトが表の所有者のスキーマに作成された場合、ファンクション索引は使用禁止になります。その後、ALTER
INDEX
... ENABLE
またはALTER
INDEX
... REBUILD
を使用してファンクション索引を使用可能にした場合、column_expression
で使用されているファンクション、パッケージまたは型は、引き続き、パブリック・シノニムが最初に指していたファンクション、パッケージまたは型に変換されます。新しいファンクション、パッケージまたは型への変換は行われません。
ファンクション索引の定義によって文字データに内部変換が生成される場合に、NLSパラメータの設定を変更するときは注意が必要です。ファンクション索引は、NLSパラメータの現行のデータベース設定を使用します。セッション・レベルでパラメータを再設定した場合、ファンクション索引を使用して問合せを行うと、無効な結果が戻る場合があります。2つの照合パラメータ(NLS_SORT
およびNLS_COMP
)は例外です。これらがセッション・レベルで再設定された場合でも、Oracle Databaseは正常に変換を処理します。
変換が明示的に要求された場合でも、Oracle Databaseはすべての場合にデータを変換できるわけではありません。たとえば、TO_NUMBER
ファンクションを使用して文字列'105 lbs'
をVARCHAR2
からNUMBER
に変換しようとすると、エラーが発生して失敗します。したがって、column_expression
にTO_NUMBER
やTO_DATE
などのデータ変換ファンクションが含まれており、後続のINSERT
またはUPDATE
文に変換ファンクションで変換できないデータが含まれている場合、INSERT
またはUPDATE
文は索引が原因で失敗します。
column_expression
に日時書式モデルが含まれている場合、列を定義するファンクション索引式では、指定の要素とは異なる書式要素が使用されることがあります。たとえば、次のように、yyyy
日時書式要素を使用してファンクション索引を定義します。
CREATE INDEX cust_eff_ix ON customers
(NVL(cust_eff_to, TO_DATE('9000-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')));
ALL_IND_EXPRESSIONS
ビューを問い合せると、列を定義するファンクション索引式でsyyyy
日時書式要素が使用されていることがわかります。
SELECT column_expression
FROM all_ind_expressions
WHERE index_name='CUST_EFF_IX';
COLUMN_EXPRESSION
------------------------------------------------------------------------------
NVL("CUST_EFF_TO",TO_DATE(' 9000-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
ファンクション索引の制限事項: ファンクション索引には、次の制限事項があります。
column_expression
で参照されるファンクションが戻す値には、Bツリー索引の索引列と同じ制限があります。「索引列の制限事項」を参照してください。
column_expression
で参照されるユーザー定義ファンクションは、DETERMINISTIC
として宣言されている必要があります。
グローバル・パーティション・ファンクション索引では、column_expression
がパーティション・キーであってはいけません。
column_expression
には、「列式」で説明されているすべての形式の式を指定できます。
パラメータがない場合も、すべてのファンクションをカッコで指定する必要があります。カッコで指定していない場合は、列名として解析されます。
column_expression
で指定するファンクションは、リピータブル値を戻す必要があります。たとえば、SYSDATE
やUSER
ファンクションまたはROWNUM
疑似列は指定できません。
ASC
またはDESC
を使用すると、索引を昇順で作成するか降順で作成するかを指定できます。文字データの索引は、データベース・キャラクタ・セットの文字値の昇順または降順で作成されます。
Oracle Databaseは、降順索引をファンクション索引として扱います。他のファンクション索引のように、最初に索引および索引が定義されている表を分析するまで、降順索引は使用しません。「column_expression」句を参照してください。
昇順の一意索引は、複数のNULL
値を含むことができます。ただし、降順の一意索引の場合は、複数のNULL
値は重複した値として扱われるため、許可されていません。
昇順索引および降順索引の制限事項: これらの句は、ドメイン索引に対して指定できません。逆索引にはDESC
を指定できません。index
をビットマップ化したり、COMPATIBLE
初期化パラメータに8.1.0未満の値を設定すると、DESC
は無視されます。
index_attributes
オプションの索引属性を指定します。
physical_attributes_clause physical_attributes_clause
を使用すると、索引の物理特性および記憶特性の値を設定できます。
この句を指定しない場合、PCTFREE
が10、INITRANS
が2に設定されます。
索引の物理属性の制限事項: PCTUSED
パラメータは、索引に対して指定できません。
TABLESPACE tablespace
には、索引、索引パーティションまたは索引サブパーティションを格納する表領域の名前を指定します。この句を指定しない場合、その索引を定義しているスキーマの所有者のデフォルトの表領域内に索引が作成されます。
ローカル索引の場合、tablespace
のかわりにキーワードDEFAULT
を指定できます。ローカル索引に追加される新規パーティションまたはサブパーティションは、基礎となる表の対応するパーティションまたはサブパーティションと同じ表領域内に作成されます。
key_compression COMPRESS
を指定すると、キー圧縮を使用可能にできます。これによって、キー列値の繰返しがなくなり、記憶域を大幅に削減できます。integer
を使用して、接頭辞の長さ(圧縮する接頭辞列数)を指定します。
Oracle Databaseでは、索引(一意でない索引または2列以上の一意索引)が圧縮されます。パーティション索引の圧縮を使用する場合は、索引レベルで圧縮を有効にして索引を作成する必要があります。そのようなパーティション索引の個々のパーティションの圧縮設定は、後で有効および無効にすることができます。個々のパーティションを再作成するときに圧縮を有効および無効にできます。索引の再作成時にのみ、既存の非パーティション索引を変更して圧縮を有効または無効にできます。
一意索引の場合、接頭辞の長さの有効範囲は、1から(キー列の数-1)です。デフォルトの接頭辞の長さは、(キー列の数-1)です。
一意でない索引の場合、接頭辞の長さの有効範囲は、1からキー列の数です。デフォルトの接頭辞の長さはキー列数です。
キー圧縮の制限事項: COMPRESS
は、ビットマップ索引に対して指定できません。
NOCOMPRESS NOCOMPRESS
を指定すると、キー圧縮を使用禁止にできます。これはデフォルトです。
SORT | NOSORT 索引の作成時に、Oracle Databaseはデフォルトで索引を昇順ソートします。NOSORT
を指定すると、索引の作成時に、データベース内ですでに昇順で格納されている行のソートを行わないようにできます。索引列の行または列が昇順に格納されていない場合、データベースはエラーを戻します。ソート時間および領域を削減するため、列を表へ初期ロードした直後にこの句を使用します。これらのキーワードのいずれも指定しない場合、デフォルトでSORT
が使用されます。
NOSORTの制限事項: このパラメータには、次の制限事項があります。
この句は、REVERSE
と同時には指定できません。
この句を使用して、クラスタ索引、パーティション索引またはビットマップ索引を作成することはできません。
索引構成表の2次索引には、この句を指定できません。
REVERSE REVERSE
を指定すると、ROWID以外の索引ブロックのバイトを逆順に格納できます。
逆索引の制限事項: 逆索引には、次の制限事項があります。
この句は、NOSORT
と同時には指定できません。
ビットマップ索引または索引構成表の索引は逆順にできません。
VISIBLE | INVISIBLE この句を使用すると、オプティマイザで索引を参照可能にするかどうかを指定できます。参照不可の索引はDML操作によってメンテナンスされますが、パラメータOPTIMIZER_USE_INVISIBLE_INDEXES
をセッションまたはシステム・レベルで明示的にTRUE
に設定しないと、問合せ時にオプティマイザによって使用されません。
既存の索引がオプティマイザによって参照可能か参照不可かを確認するには、USER_
、DBA_
、ALL_INDEXES
データ・ディクショナリ・ビューのVISIBILITY
列を問い合せます。
関連項目: この機能の詳細は、『Oracle Database管理者ガイド』を参照してください。 |
logging_clause 索引作成を、REDOログ・ファイル内に記録する(LOGGING
)か記録しない(NOLOGGING
)かを指定します。この設定によって、索引に対する後続のダイレクト・ローダー(SQL*Loader)およびダイレクト・パス・インサート操作を記録するか記録しないかも決定されます。デフォルトは
LOGGING
です。
index
が非パーティション索引の場合、この句は索引のロギング属性を指定します。
index
がパーティション索引の場合、この句は次の値を決定します。
CREATE
文で指定されたすべてのパーティションのデフォルト値(PARTITION
記述句でlogging_clause
を指定している場合を除く)
索引パーティションに関連付けられたセグメントに対するデフォルト値
後続のALTER
TABLE
... ADD
PARTITION
操作中に暗黙的に追加されたローカル索引パーティションまたはサブパーティションに対するデフォルト値
索引のロギング属性は、その実表の属性に依存しません。
この句を指定しない場合、ロギング属性は表が存在する表領域の属性になります。
関連項目:
|
ONLINE ONLINE
を指定すると、索引作成中の表でのDML操作を許可できます。
オンライン索引の作成の制限事項: オンライン索引の作成には、次の制限事項があります。
オンライン索引の作成中は、パラレルDMLはサポートされません。ONLINE
を指定し、パラレルDML文を発行すると、Oracle Databaseはエラーを戻します。
ビットマップ索引またはクラスタ索引には、ONLINE
を指定できません。
UROWID
列の従来索引には、ONLINE
を指定できません。
索引構成表の一意でない2次索引の場合、索引構成表内の索引キー列の数と論理ROWIDの主キー列の数の合計は、32以下にする必要があります。論理ROWIDは、索引キーに含まれる列を除外します。
関連項目: オンライン索引の作成および再作成については、『Oracle Database概要』を参照してください。 |
parallel_clause
を指定すると、索引の作成をパラレル化できます。
この句の詳細は、「CREATE
TABLE
」の「parallel_clause」を参照してください。
global_partitioned_index
句およびlocal_partitioned_index
句を使用すると、index
をパーティション化できます。
ブロック・サイズが異なる表領域のパーティション化されたデータベース・エンティティの記憶域には、制限事項があります。これらの制限事項については、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。
global_partitioned_index
を使用すると、索引のパーティション化がユーザー定義であり、基礎となる表と同一レベルでパーティション化されないことを指定できます。デフォルトでは、非パーティション索引はグローバル索引です。
グローバル索引には、レンジ・パーティション化またはハッシュ・パーティション化を実行できます。どちらの場合でも、パーティション・キー列に最大32列を指定できます。列リストをパーティション化する場合、索引の列リストの左の接頭辞を指定する必要があります。索引が列a
、b
およびc
に定義されている場合は、列に(a
, b
, c)
、(a
, b)
または(a
, c)
は指定できますが、(b
, c)
、(c)
または(b
, a)
は指定できません。パーティション名を省略すると、SYS_P
n
の形式で名前が生成されます。
GLOBAL PARTITION BY RANGE この句を使用すると、レンジ・パーティション・グローバル索引を作成できます。列リストに指定した表の列の値の範囲に基づいて、グローバル索引がパーティション化されます。
GLOBAL PARTITION BY HASH この句を使用すると、ハッシュ・パーティション・グローバル索引を作成できます。パーティション・キー列の値にハッシュ・ファンクションを使用して、行がパーティションに割り当てられます。
関連項目: ハッシュ・パーティションの2つの方法については、「CREATE TABLE 」句の「hash_partitions」および「ハッシュ・パーティション・グローバル索引の作成例:」を参照してください。 |
グローバル・パーティション索引の制限事項: グローバル・パーティション索引には、次の制限事項があります。
パーティション・キー列リストには、ROWID
類似列またはROWID
型の列は指定できません。
ハッシュ・パーティションに指定できるプロパティは、表領域の記憶域のみです。そのため、individual_hash_partitions
のpartitioning_storage_clause
にLOBまたはVARRAYの記憶域句を指定できません。
hash_partitions_by_quantity
のOVERFLOW
句は、索引構成表のパーティションに対してのみ指定できます。
partitioning_storage_clause
では、table_compression
は指定できませんが、key_compression
は指定できます。
注意: 異なるキャラクタ・セットを使用してデータベースを使用しているか、使用する予定がある場合は、キャラクタ列を分割する際に注意してください。文字のソート順序は、すべてのキャラクタ・セットで同一ではありません。 |
関連項目: キャラクタ・セット・サポートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
index_partitioning_clause この句を使用すると、個々の索引パーティションを記述できます。この句が繰り返される数によってパーティションの数が決まります。partition
を指定しない場合、名前はSYS_P
n
の形式で生成されます。
VALUES
LESS
THAN
(value_list
)には、グローバル索引の現在のパーティションの境界は含まない上限を指定します。値のリストは、global_partitioned_index
句の列リストに対応するリテラル値を含む、カンマで区切られた順序リストです。最後のパーティションの値としては、必ずMAXVALUE
を指定します。
注意: 索引がDATE 列でパーティション化されている場合、および日付書式で年の最初の2桁の数字が指定されていない場合、年の4文字書式マスクでTO_DATE ファンクションを使用する必要があります。日付書式は、NLS_TERRITORY によって暗黙的に決定され、NLS_DATE_FORMAT によって明示的に決定されます。これらの初期化パラメータの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
local_partitioned_index
句を使用すると、table
と同じパーティション数および同じパーティション境界を使用し、同じ列で索引をパーティション化できます。コンポジット・パーティション表では、この句を使用すると、table
と同じパーティション数および同じパーティション境界を使用し、同じ列で索引をパーティション化できます。基礎となる表が再パーティション化された場合、ローカル索引のパーティションは自動的に保持されます。
キーワードLOCAL
のみを指定して、副次句を指定しない場合、Oracle Databaseは対応する表パーティションとして、同じ表領域に各索引パーティションを作成し、対応する表パーティションと同じ名前を割り当てます。表
がコンポジット・パーティション表である場合、Oracle Databaseは対応する表サブパーティションとして、同じ表領域に各索引パーティションを作成して、対応する表サブパーティションと同じ名前を割り当てます。
on_range_partitioned_table この句を使用すると、レンジ・パーティション表の索引パーティションの名前および属性を指定できます。この句を指定する場合、PARTITION
句は、表パーティションと同一の数と順序である必要があります。partition
を指定しない場合、対応する表のパーティションと一貫した名前が生成されます。その名前が既存の索引パーティション名と競合する場合は、SYS_P
n
の形式が使用されます。
索引にキー圧縮が指定されていない場合、索引パーティションにキー圧縮を指定することはできません。
UNUSABLE
句の詳細は、「UNUSABLE」を参照してください。
on_list_partitioned_table on_list_partitioned_table
句は、「on_range_partitioned_table」と同一です。
on_hash_partitioned_table この句を使用すると、ハッシュ・パーティション表の索引パーティションの名前および表領域の記憶域を指定できます。
PARTITION
句を指定する場合、これらの句の数は表パーティションの数と同一である必要があります。partition
を指定しない場合、対応する表のパーティションと一貫した名前が生成されます。その名前が既存の索引パーティション名と競合する場合は、SYS_P
n
の形式が使用されます。オプションで、1つ以上の個々のパーティションに表領域の記憶域を指定できます。この句またはSTORE
IN
句に表領域の記憶域を指定しない場合、各索引パーティションが、対応する表パーティションと同じ表領域に格納されます。
STORE
IN
句を使用して、すべての索引ハッシュ・パーティションを分散させる1つ以上の表領域を指定できます。表領域の数は、索引パーティションの数と等しくなる必要はありません。索引パーティションの数が表領域の数より多い場合は、表領域名が繰り返し使用されます。
UNUSABLE
句の詳細は、「UNUSABLE」を参照してください。
on_comp_partitioned_table この句を使用すると、コンポジット・パーティション表の索引パーティションの名前および属性を指定できます。
STORE
IN
句は、レンジ-ハッシュまたはリスト-ハッシュ・コンポジット・パーティション表に対してのみ有効です。すべてのパーティションのすべての索引ハッシュ・サブパーティションを分散させる1つ以上のデフォルト表領域を指定できます。index_subpartition_clause
の第2 STORE
IN
句で個々のパーティションのサブパーティションに対して異なるデフォルト表領域の記憶域を指定すると、この記憶域を上書きできます。
レンジ-レンジ、レンジ-リストおよびリスト-リスト・コンポジット・パーティション表に対しては、PARTITION
句に指定したレンジまたはリスト・サブパーティションのデフォルトの属性を指定できます。index_subpartition_clause
のSUBPARTITION
句の個々のパーティションのレンジまたはリスト・サブパーティションに異なる属性を指定すると、この記憶域を上書きできます。
索引にキー圧縮が指定されていない場合、索引パーティションにキー圧縮を指定することはできません。
UNUSABLE
句の詳細は、「UNUSABLE」を参照してください。
index_subpartition_clause この句を使用すると、コンポジット・パーティション表の索引サブパーティションに名前および表領域の記憶域を指定できます。
STORE
IN
句は、レンジ-ハッシュおよびリスト-ハッシュ・コンポジット・パーティション表のハッシュ・サブパーティションに対してのみ有効です。すべての索引ハッシュ・サブパーティションを分散させる1つ以上の表領域を指定できます。SUBPARTITION
句は、すべてのサブパーティション・タイプに対して有効です。
SUBPARTITION
句を指定する場合、これらの句の数は表サブパーティションの数と同一である必要があります。subpartition
を指定しない場合、対応する表のサブパーティションと一貫した名前が生成されます。その名前が既存の索引サブパーティション名と競合する場合は、SYS_SUBP
n
の形式が使用されます。
表領域の数は、索引サブパーティションの数と等しくなる必要はありません。索引サブパーティションの数が表領域の数より多い場合は、表領域名が繰り返し使用されます。
on_comp_partitioned_table
句またはindex_subpartition_clause
にサブパーティションの表領域の記憶域を指定しない場合、index
に指定された表領域が使用されます。index
に表領域の記憶域を指定しない場合、サブパーティションが、対応する表サブパーティションと同じ表領域に格納されます。
UNUSABLE
句の詳細は、「CREATE
INDEX
」の「UNUSABLE」を参照してください。
domain_index_clause
を使用して、index
が、アプリケーション固有のindextype
索引タイプのインスタンスであるドメイン索引であることを示します。
ドメイン索引を作成する前に、複数の操作を行う必要があります。まず、索引タイプの実装タイプを作成します。また、ファンクション実装を作成し、そのファンクションを使用する演算子も作成します。次に、演算子と実装タイプを関連付ける索引タイプを作成します。最後にこの句を使用してドメイン索引を作成します。付録F「詳細な例」に、これらのすべての操作を含んだ単純なドメイン索引の作成例を記載しています。
index_expr index_expr
(table_index_clause
内)に、索引が定義されている表の列またはオブジェクトの属性を指定します。基礎となる索引タイプが異なり、その索引タイプがユーザー定義操作の分割セットをサポートする場合のみ、1つの列に複数のドメイン索引を定義できます。
ドメイン索引の制限事項: ドメイン索引には、次の制限事項があります。
index_expr
(table_index_clause
内)には1つの列のみ指定でき、データ型がREF
、VARRAY、ネストした表、LONG
またはLONG
RAW
の列は指定できません。
ビットマップ索引または一意ドメイン索引は作成できません。
一時表には、ドメイン索引は作成できません。
ローカル・ドメイン索引は、レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表または時間隔パーティション表にのみ作成できます。
indextype indextype
では、索引タイプの名前を指定します。名前は、作成済の有効なスキーマ・オブジェクトである必要があります。
Oracle Textをインストールしている場合、様々な組込み索引タイプを使用して、Oracle Textドメイン索引を作成できます。Oracle TextおよびOracle Textが使用する索引の詳細は、『Oracle Textリファレンス』を参照してください。
local_domain_index_clause この句を使用すると、パーティション表のローカル索引を索引にするように指定できます。
PARTITIONS
句を使用すると、索引パーティションの名前を指定できます。指定するパーティション数は、実表内のパーティション数と一致する必要があります。この句を省略すると、SYS_P
n
という形式のシステム生成の名前でパーティションが作成されます。
PARAMETERS
句を使用すると、個々のパーティション固有のパラメータ文字列を指定できます。この句を省略した場合、索引に関連付けられたパラメータ文字列はパーティションにも関連付けられます。
parallel_clause parallel_clause
を使用すると、ドメイン索引の作成をパラレル化できます。非パーティション・ドメイン索引の場合、Oracle Databaseは明示的またはデフォルトの並列度をODCIIndexCreate
カートリッジ・ルーチンに渡し、ODCIIndexCreateカートリッジ・ルーチンが索引の並列性を確立します。ローカル・ドメイン索引の場合、この句によって索引パーティションはパラレルに作成されます。
関連項目: Oracle Data Cartridge Interface(ODCI)ルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。 |
PARAMETERS PARAMETERS
句で、未解析のまま適切なODCI索引タイプ・ルーチンに渡されたパラメータ文字列を指定します。パラメータ文字列の最大長は1,000文字です。
構文の最上位でこの句を指定した場合、パラメータは索引パーティションのデフォルトのパラメータになります。local_domain_index_clause
の一部としてこの句を指定すると、個々のパーティションのパラメータでデフォルトのパラメータを上書きできます。
ドメイン索引が作成されると、適切なODCIルーチンがコールされます。ルーチンが正常に戻らない場合、ドメイン索引はFAILED
のマークが付けられます。失敗したドメイン索引でサポートされる操作は、DROP
INDEX
およびREBUILD
INDEX
(非ローカル索引用)のみです。
関連項目: Oracle Data Cartridge Interface(ODCI)ルーチンの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。 |
XMLIndex_clause
を使用すると、一般にはXMLデータが含まれる列に、XMLIndex
索引を定義できます。XMLIndex
索引は、特にXMLデータのドメイン用に設計されたドメイン索引の一種です。
XMLIndex_parameters_clause
この句を使用すると、パス表に関する情報およびXMLIndexのコンポーネントに対応する2次索引に関する情報を指定できます。また、この句を使用すると、索引の構造化コンポーネントの詳細を指定できます。パラメータ文字列の最大長は1,000文字です。
構文の最上位でこの句を指定した場合、パラメータは索引のパラメータおよび索引パーティションのデフォルトのパラメータになります。local_xmlindex_clause
句の一部としてこの句を指定すると、個々のパーティションのパラメータでデフォルトのパラメータを上書きできます。
関連項目: XMLIndex_parameters_clause 句の構文およびセマンティクスの詳細、およびXMLIndex の使用の詳細は、『Oracle XML DB開発者ガイド』を参照してください。 |
bitmap_join_index_clause
を使用すると、ビットマップ結合索引を定義できます。ビットマップ結合索引は、単一の表に定義します。ディメンション表の列で構成される索引キーには、そのキーに対応するファクト表のROWIDが格納されます。データ・ウェアハウス環境では、一般的に、索引を定義する表をファクト表といい、ファクト表と結合した表をディメンション表といいます。ただし、結合索引の作成にはスター・スキーマは必須ではありません。
ON ON
句には、まずファクト表を指定し、次に索引を定義するディメンション表の列をカッコ内に指定します。
FROM FROM
句には、結合した表を指定します。
WHERE WHERE
句には、結合条件を指定します。
基礎となるファクト表がパーティション化されている場合、local_partitioned_index
句(「local_partitioned_index」を参照)のいずれかを指定する必要があります。
ビットマップ結合索引の制限事項: 一般的なビットマップ索引の制限事項(「BITMAP」を参照)に加え、ビットマップ結合索引には次の制限事項があります。
一時表にはビットマップ結合索引は作成できません。
FROM
句で表を2回指定できません。
ファンクション結合索引は作成できません。
ディメンション表の列は、主キー列であるか、または一意制約を含む必要があります。
ディメンション表が複合主キーを含む場合、主キーの各列は結合の一部である必要があります。
ファクト表がパーティション化されていない場合は、local_partitioned_index
句を指定できません。
関連項目: ファクト表とディメンション表、およびデータ・ウェアハウス環境でのビットマップ索引の使用については、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。 |
UNUSABLE
を指定すると、UNUSABLE
状態で索引を作成できます。使用禁止の索引を使用可能にする場合、再構築するか、または削除して再作成する必要があります。
索引がパーティション化されている場合、索引パーティションはすべてUNUSABLE
としてマークされます。後で一部の索引パーティションのみを再作成してUSABLE
にすることができます。これは、一部の索引パーティションのみで索引を保持する場合に有効です。たとえば、新しいパーティションでは索引アクセスを有効にするものの、古いパーティションでは有効にしない場合などに有効です。
索引または索引の一部のパーティションまたはサブパーティションにUNUSABLE
のマークが付けられている場合は、その使用禁止のオブジェクトにはセグメントは割り当てられません。使用禁止の索引または索引パーティションは、データベース内で領域を使用しません。
索引、または索引の一部のパーティションやサブパーティションにUNUSABLE
のマークが付けられている場合は、2つの条件を満たすときにのみ、索引はオプティマイザによってアクセス・パスとみなされます。1つは、オプティマイザがアクセス対象のパーティションをコンパイル時に認識していること、もう1つは、アクセス対象のすべてのパーティションにUSABLE
のマークが付けられていることです。そのため、問合せにバインド変数を含めることはできません。
UNUSABLEの制限事項: 索引にUNUSABLE
のマークを付ける場合は、次の制限事項があります。
この句は、一時表の索引に対して指定できません。
次の状況では、使用禁止の索引または索引パーティションにもセグメントが割り当てられます。
索引(または索引パーティション)がSYS
、SYSTEM
、PUBLIC
、OUTLN
またはXDB
によって所有されている場合
索引(または索引パーティション)がディクショナリ管理表領域に格納されている場合
パーティションのメンテナンス操作が行われているため、パーティション表のグローバル・パーティション索引または非パーティション索引が使用禁止になっている場合
一般的な索引の例
索引の作成例: 次の文は、サンプル表oe.orders
のcustomer_id
列にサンプル索引ord_customer_ix
を作成します。
CREATE INDEX ord_customer_ix ON orders (customer_id);
索引の圧縮例: 次の文は、COMPRESS
句を使用して索引ord_customer_ix_demo
を作成します。
CREATE INDEX ord_customer_ix_demo ON orders (customer_id, sales_rep_id) COMPRESS 1;
索引は、customer_id
列値の繰返し項目を圧縮します。
NOLOGGINGモードでの索引の作成例: サンプル表orders
が高速パラレル・ロードで作成された場合(すべての行がソート済である場合)、次の文は、迅速に索引を作成します。
/* Unless you first sort the table oe.orders, this example fails because you cannot specify NOSORT unless the base table is already sorted. */ CREATE INDEX ord_customer_ix_demo ON orders (order_mode) NOSORT NOLOGGING;
クラスタ索引の作成例: 次の文は、personnel
クラスタ(「クラスタの作成例:」で作成)に対して索引を作成します。
CREATE INDEX idx_personnel ON CLUSTER personnel;
クラスタ・キーのすべての列にクラスタ索引が自動的に作成されるため、索引列は指定しません。クラスタ索引の場合は、すべての行に索引が付きます。
XMLType表の索引の作成例: 次の例は、xwarehouses
表(「XMLType表の例:」で作成)の領域要素に索引を作成します。
CREATE INDEX area_index ON xwarehouses e (EXTRACTVALUE(VALUE(e),'/Warehouse/Area'));
この索引によって、たとえば、次の文にあるような倉庫の面積(平方フィート)に基づいた表から選択する問合せのパフォーマンスが大幅に向上します。
SELECT e.getClobVal() AS warehouse FROM xwarehouses e WHERE EXISTSNODE(VALUE(e),'/Warehouse[Area>50000]') = 1;
ファンクション索引の例
次の例では、ファンクション索引を作成および使用する方法を示します。
ファンクション索引の作成例: 次の文は、last_name
列の大文字評価に基づくemployees
表にファンクション索引を作成します。
CREATE INDEX upper_ix ON employees (UPPER(last_name));
ファンクション索引の作成に必要な権限およびパラメータ設定の詳細は、「前提条件」を参照してください。
全表スキャンを実行するのではなく、索引が使用される可能性を高めるには、ファンクションが戻す値を後続の問合せでNULL以外にします。たとえば、次の文では、オプティマイザの動作を阻止する条件が他に存在しないかぎり、索引が使用されます。
SELECT first_name, last_name FROM employees WHERE UPPER(last_name) IS NOT NULL ORDER BY UPPER(last_name);
WHERE
句を指定しないと、全表スキャンが実行される場合があります。
索引の作成および後続の問合せを示す次の文では、問合せで列の順序が逆であっても、Oracle Databaseはincome_ix
を使用します。
CREATE INDEX income_ix ON employees(salary + (salary*commission_pct)); SELECT first_name||' '||last_name "Name" FROM employees WHERE (salary*commission_pct) + salary > 15000 ORDER BY employee_id;
LOB列のファンクション索引の作成例: 次の文は、text_length
ファンクションを使用し、サンプル・スキーマpm
のLOB列にファンクション索引を作成します。このファンクションを作成する例については、『Oracle Database PL/SQL言語リファレンス』を参照してください。例では、CLOB
列が1000字未満のサンプル表print_media
から行を検索します。
CREATE INDEX src_idx ON print_media(text_length(ad_sourcetext)); SELECT product_id FROM print_media WHERE text_length(ad_sourcetext) < 1000 ORDER BY product_id; PRODUCT_ID ---------- 2056 2268 3060 3106
型メソッドのファンクション索引の作成例: この例には、2つの数値属性(length
およびwidth
)を含むオブジェクト型rectangle
が必要です。area()
メソッドは、四角形の面積を計算します。
CREATE TYPE rectangle AS OBJECT ( length NUMBER, width NUMBER, MEMBER FUNCTION area RETURN NUMBER DETERMINISTIC ); CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN (length*width); END; END;
rectangle
型の表rect_tab
を作成する場合、次のようにarea()
メソッドにファンクション索引を作成できます。
CREATE TABLE rect_tab OF rectangle; CREATE INDEX area_idx ON rect_tab x (x.area());
この索引を効率的に使用して、次の形式の問合せを評価できます。
SELECT * FROM rect_tab x WHERE x.area() > 100;
ファンクション索引の使用による条件付き一意性の定義例: 次の文は、oe.orders
表に一意なファンクション索引を作成して、プロモーションID 2(大規模なセール)を顧客が2回以上利用できないようにします。
CREATE UNIQUE INDEX promo_ix ON orders (CASE WHEN promotion_id =2 THEN customer_id ELSE NULL END, CASE WHEN promotion_id = 2 THEN promotion_id ELSE NULL END); INSERT INTO orders (order_id, order_date, customer_id, order_total, promotion_id) VALUES (2459, systimestamp, 106, 251, 2); 1 row created. INSERT INTO orders (order_id, order_date, customer_id, order_total, promotion_id) VALUES (2460, systimestamp+1, 106, 110, 2); insert into orders (order_id, order_date, customer_id, order_total, promotion_id) * ERROR at line 1: ORA-00001: unique constraint (OE.PROMO_IX) violated
promotion_id
が2以外の行を索引から削除するようにします。Oracle Databaseでは、すべてのキーがNULL
の行は索引内に格納されません。したがって、この例では、promotion_idが2である場合以外は、customer_id
とpromotion_id
の両方がNULL
にマップされます。その結果、customer_id
値が同じ2つの行についてpromotion_idが2の場合にのみ、索引の制約に違反することになります。
パーティション索引の例
レンジ・パーティション・グローバル索引の作成例: 次の文は、コストの範囲を3つのグループに分割した3つのパーティションを含むサンプル表sh.sales
にグローバル同一キー索引cost_ix
を作成します。
CREATE INDEX cost_ix ON sales (amount_sold) GLOBAL PARTITION BY RANGE (amount_sold) (PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (2500), PARTITION p3 VALUES LESS THAN (MAXVALUE));
ハッシュ・パーティション・グローバル索引の作成例: 次の文は、4つのパーティションを持つサンプル表sh.customers
に、ハッシュ・パーティション・グローバル索引cust_last_name_ix
を作成します。
CREATE INDEX cust_last_name_ix ON customers (cust_last_name) GLOBAL PARTITION BY HASH (cust_last_name) PARTITIONS 4;
ハッシュ・パーティション表の索引の作成例: 次の文は、hash_products
パーティション表(「ハッシュ・パーティション化の例:」で作成)のcategory_id
列にローカル索引を作成します。LOCAL
の直後に記述されたSTORE
IN
句は、hash_products
がハッシュ・パーティション化されていることを示します。Oracle Databaseは、tbs1
表領域とtbs2
表領域にハッシュ・パーティションを分散させます。
CREATE INDEX prod_idx ON hash_products(category_id) LOCAL STORE IN (tbs_01, tbs_02);
索引を作成するには、指定する表領域に対して割当て制限を持つ必要があります。表領域tbs_01
およびtbs_02
を作成する例は、「CREATE TABLESPACE」を参照してください。
コンポジット・パーティション表の索引の作成例: 次の文は、composite_sales
表(「コンポジット・パーティション表の例:」で作成)にローカル索引を作成します。STORAGE
句では、索引のデフォルトの記憶域属性を指定します。ただし、別のTABLESPACE
記憶域が指定されているため、このデフォルトは、パーティションq3_2000
およびq4_2000
の5つのサブパーティションに上書きされます。
索引を作成するには、指定する表領域に対して割当て制限を持つ必要があります。表領域tbs_02
およびtbs_03
を作成する例は、「CREATE TABLESPACE」を参照してください。
CREATE INDEX sales_ix ON composite_sales(time_id, prod_id) STORAGE (INITIAL 1M) LOCAL (PARTITION q1_1998, PARTITION q2_1998, PARTITION q3_1998, PARTITION q4_1998, PARTITION q1_1999, PARTITION q2_1999, PARTITION q3_1999, PARTITION q4_1999, PARTITION q1_2000, PARTITION q2_2000 (SUBPARTITION pq2001, SUBPARTITION pq2002, SUBPARTITION pq2003, SUBPARTITION pq2004, SUBPARTITION pq2005, SUBPARTITION pq2006, SUBPARTITION pq2007, SUBPARTITION pq2008), PARTITION q3_2000 (SUBPARTITION c1 TABLESPACE tbs_02, SUBPARTITION c2 TABLESPACE tbs_02, SUBPARTITION c3 TABLESPACE tbs_02, SUBPARTITION c4 TABLESPACE tbs_02, SUBPARTITION c5 TABLESPACE tbs_02), PARTITION q4_2000 (SUBPARTITION pq4001 TABLESPACE tbs_03, SUBPARTITION pq4002 TABLESPACE tbs_03, SUBPARTITION pq4003 TABLESPACE tbs_03, SUBPARTITION pq4004 TABLESPACE tbs_03) );
ビットマップ索引の例
次の文は、表oe.hash_products
(「ハッシュ・パーティション化の例:」で作成)にビットマップ索引を作成します。
CREATE BITMAP INDEX product_bm_ix ON hash_products(list_price) LOCAL(PARTITION ix_p1 TABLESPACE tbs_01, PARTITION ix_p2, PARTITION ix_p3 TABLESPACE tbs_02, PARTITION ix_p4, PARTITION ix_p5 TABLESPACE tbs_03) TABLESPACE tbs_04;
hash_products
はパーティション表であるため、ビットマップ結合索引はローカル・パーティションである必要があります。この例では、指定する表領域に対して割当て制限を持つ必要があります。表領域tbs_01
、tbs_02
、tbs_03
およびtbs_04
を作成する例は、「CREATE TABLESPACE」を参照してください。
次の一連の文は、結合とディメンション表を使用してファクト表上にビットマップ結合索引を作成する方法を示します。
CREATE TABLE hash_products ( product_id NUMBER(6) , product_name VARCHAR2(50) , product_description VARCHAR2(2000) , category_id NUMBER(2) , weight_class NUMBER(1) , warranty_period INTERVAL YEAR TO MONTH , supplier_id NUMBER(6) , product_status VARCHAR2(20) , list_price NUMBER(8,2) , min_price NUMBER(8,2) , catalog_url VARCHAR2(50) , CONSTRAINT pk_product_id PRIMARY KEY (product_id) , CONSTRAINT product_status_lov_demo CHECK (product_status in ('orderable' ,'planned' ,'under development' ,'obsolete') ) ) PARTITION BY HASH (product_id) PARTITIONS 5 STORE IN (example); CREATE TABLE sales_quota ( product_id NUMBER(6) , customer_name VARCHAR2(50) , order_qty NUMBER(6) ,CONSTRAINT u_product_id UNIQUE(product_id) ); CREATE BITMAP INDEX product_bm_ix ON hash_products(list_price) FROM hash_products h, sales_quota s WHERE h.product_id = s.product_id LOCAL(PARTITION ix_p1 TABLESPACE example, PARTITION ix_p2, PARTITION ix_p3 TABLESPACE example, PARTITION ix_p4, PARTITION ix_p5 TABLESPACE example) TABLESPACE example;
ネストした表の索引の例:
サンプル表pm.print_media
には、記憶表textdocs_nestedtab
に格納されたネストした表の列ad_textdocs_ntab
が含まれます。次の文は、記憶表textdocs_nestedtab
に一意索引を作成します。
CREATE UNIQUE INDEX nested_tab_ix ON textdocs_nestedtab(NESTED_TABLE_ID, document_typ);
疑似列NESTED_TABLE_ID
を組み込むことによって、ネストした表の列ad_textdocs_ntab
内に固有の行が確保されます。
置換可能な列の索引の作成例:
置換可能な列を宣言した型の属性に、索引を作成できます。また、適切なTREAT
ファンクションの使用によって、サブタイプの属性を参照できます。次の例では、表books
(「置換可能な表および列のサンプル:」で作成)を使用します。この文は、books
表の、すべてのemployee_t型のauthorのsalary
属性に索引を作成します。
CREATE INDEX salary_i ON books (TREAT(author AS employee_t).salary);
TREAT
ファンクションの引数のターゲットとなる型は、参照する属性を追加した型である必要があります。例では、TREAT
のターゲットは、employee_t
で、salary
属性を追加した型です。
この条件を満たさない場合、TREAT
ファンクションがファンクションの定義式として解析され、ファンクション索引が作成されます。たとえば、次の文は、パートタイム従業員のsalary
属性にファンクション索引を作成し、型の階層に含まれる他のすべての型のインスタンスにNULLを割り当てます。
CREATE INDEX salary_func_i ON persons p (TREAT(VALUE(p) AS part_time_emp_t).salary);
SYS_TYPEID
ファンクションの使用によって、置換可能な列を基礎とする型判別式の列に索引を作成できます。
注意: Oracle Databaseは型判別式の列を使用し、IS OF type 条件を含む問合せを評価します。型ID列のカーディナリティが通常低い場合、ビットマップ索引を作成することをお薦めします。 |
次の文は、books表のauthor列の型IDにビットマップ索引を作成します。
CREATE BITMAP INDEX typeid_i ON books (SYS_TYPEID(author));
関連項目:
|