CREATE INDEX
目的
CREATE
INDEX
文を使用すると、次のものに索引を作成できます。
-
表の1つ以上の列、パーティション表、索引構成表またはクラスタ
-
表またはクラスタの1つ以上のスカラー型オブジェクト属性
-
ネストした表の列の索引を作成するためのネストした表の記憶表
索引は、表またはクラスタの索引列に表示されるそれぞれの値のエントリが含まれるスキーマ・オブジェクトであり、行に対する直接かつ高速のアクセスを提供します。単一の索引エントリの最大サイズは、データベースのブロック・サイズによって異なります。
Oracle Databaseは次のタイプの索引をサポートしています。
-
通常の索引。(デフォルトではBツリー索引が作成されます。)
-
ビットマップ索引。キー値に関連付けられたROWIDをビットマップとして格納します。
-
パーティション索引。表の索引付き列に表示される各値のエントリを含むパーティションで構成されます。
-
ファンクション索引。式をベースとしています。式によって戻される値を評価する問合せを構成できます。その式には、組込みファンクションまたはユーザー定義ファンクションを含めることができます。
ノート:
-
索引については、『Oracle Database概要』を参照してください。
-
索引サイズに関連する制限の詳細は、『Oracle Databaseリファレンス』を参照してください。
-
索引作成による圧縮属性の継承方法の詳細は、『Oracle Databaseリファレンス』を参照してください
-
「ALTER INDEX」および「DROP INDEX」を参照してください。
前提条件
自分のスキーマ内に索引を作成する場合は、次のいずれかの条件が満たされている必要があります。
-
索引を作成する表またはクラスタが自分のスキーマ内に定義されている。
-
索引を作成する表に対する
INDEX
オブジェクト権限を持っている。 -
CREATE
ANY
INDEX
システム権限を持っている。
他のユーザーのスキーマ内に索引を作成する場合は、CREATE
ANY
INDEX
システム権限が必要です。また、索引が定義されているスキーマの所有者には、UNLIMITED
TABLESPACE
システム権限、あるいはその索引または索引パーティションを格納するための表領域の割当て制限のいずれかが必要です。
ファンクション索引を作成する場合は、従来索引の作成の前提条件の他に、索引がユーザー定義ファンクションに基づいている場合は、ファンクションにDETERMINISTIC
のマークを付ける必要があります。ファンクション索引は、索引の所有者の資格証明を使用して実行されるため、索引の所有者には、ファンクションに対するEXECUTE
オブジェクト権限が必要です。
自分のスキーマにドメイン索引を作成する場合、従来索引の作成の前提条件の他に、索引タイプに対するEXECUTE
オブジェクト権限が必要です。他のユーザーのスキーマにドメイン索引を作成する場合、索引の所有者にも索引タイプおよびその基礎となる実装タイプに対するEXECUTE
オブジェクト権限が必要です。ドメイン索引を作成する前に、索引タイプを定義する必要があります。
関連項目:
構文
create_index::=
(cluster_index_clause::=、table_index_clause::=、bitmap_join_index_clause::=)
index_expr::=
index_properties::=
(global_partitioned_index::=、local_partitioned_index::=、index_attributes::=、domain_index_clause::=、XMLIndex_clause::=)
index_attributes::=
(physical_attributes_clause::=、logging_clause::=、index_compression::=、partial_index_clause::=、parallel_clause::=、annotations_clause)
logging_clause::=
index_compression::=
prefix_compression::=
advanced_index_compression::=
partial_index_clause::=
local_domain_index_clause::=
XMLIndex_clause::=
(XMLIndex_parameters_clause
については、『Oracle XML DB開発者ガイド』を参照してください。)
local_XMLIndex_clause::=
(XMLIndex_parameters_clause
については、『Oracle XML DB開発者ガイド』を参照してください。)
annotations_clause::=
annotations_clause
の完全な構文およびセマンティクスについては、「annotations_clause」を参照してください。
global_partitioned_index::=
(index_partitioning_clause::=、individual_hash_partitions::=、hash_partitions_by_quantity::=)
individual_hash_partitions::=
(read_only_clause
およびindexing_clause
は、table_index_clause
、partitioning_storage_clause::=ではサポートされていません。)
partitioning_storage_clause::=
(TABLESPACE
SET
、table_compression
、inmemory_clause
およびilm_clause
は、CREATE
INDEX
、index_compression::=、LOB_partitioning_storage::=ではサポートされていません。)
LOB_partitioning_storage::=
(TABLESPACE
SET
: CREATE
INDEX
ではサポートされていません)
hash_partitions_by_quantity::=を参照
local_partitioned_index::=
(on_range_partitioned_table::=、on_list_partitioned_table::=、on_hash_partitioned_table::=、on_comp_partitioned_table::=)
segment_attributes_clause::=
(physical_attributes_clause::=、TABLESPACE
SET
: CREATE
INDEX
ではサポートされていません、logging_clause::=)
on_comp_partitioned_table::=
(segment_attributes_clause::=、index_compression::=、index_subpartition_clause::=)
parallel_clause::=
セマンティクス
UNIQUE
UNIQUE
を指定すると、索引のベースとなっている列の値が一意である必要があることを指定できます。
一意索引の制限事項
一意索引には、次の制限事項があります。
-
UNIQUE
およびBITMAP
は同時に指定できません。 -
ドメイン索引には
UNIQUE
を指定できません。
関連項目:
一意制約を満たす条件の詳細は、「一意制約」を参照してください。
BITMAP
BITMAP
を指定すると、index
が各行を分割した索引付けではなく、各個別キーのビットマップで作成されることを指定できます。ビットマップ索引では、キー値にビットマップとして関連付けられたROWIDが格納されます。ビットマップ内の各ビットは、使用可能なROWIDに対応しています。ビットが設定されていれば、それに対応するROWIDを持つ行に、キー値が設定されていることになります。ビットマップの内部表現は、データ・ウェアハウスなど、低レベルの同時実行トランザクションが実行されるアプリケーションに最適です。
ノート:
Oracleでは、すべてのキー列がNULLの表の行には索引を付けません(ただし、ビットマップ索引の場合を除きます)。したがって、表のすべての行に索引を作成する場合、索引のキー列にNOT
NULL
制約を指定するか、またはビットマップ索引を作成する必要があります。
ビットマップ索引の制限事項
ビットマップ索引には、次の制限事項があります。
-
グローバル・パーティション索引の作成には
BITMAP
を指定できません。 -
索引構成表がビットマップ化した2次索引に対応するマッピング表を持たない場合、索引構成表にビットマップ化した2次索引を作成できません。
-
UNIQUE
およびBITMAP
は同時に指定できません。 -
ドメイン索引には
BITMAP
を指定できません。 -
ビットマップ索引には最大30列を指定できます。
関連項目:
-
ビットマップ索引の使用の詳細は、『Oracle Database概要』および『Oracle Database SQLチューニング・ガイド』を参照してください。
-
マッピング表の詳細は、「CREATE TABLE」を参照してください。
MULTIVALUE
MULTIVALUE
キーワードを使用すると、単純なドット表記法構文を使用してJSONデータに複数値索引を作成し、索引付きデータへのパスを指定できます。
例
ここで作成された複数値索引は、トップレベル・フィールドcredit_score
の値を索引付けします。問合せの対象となるcredit_score
値が配列の場合、数値である配列要素の索引を取得できます。値がスカラーの場合、スカラーが数値であれば索引を取得できます。
CREATE MULTIVALUE INDEX mvi_1 ON mytable t (t.jcol.credit_score.numberOnly());
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
索引が存在していない場合は、文の最後に新しい索引が作成されます。
-
索引が存在している場合、これは文の最後の時点にある索引になります。古い索引が検出されるため、新しいものは作成されません。
IF EXISTS
はCREATE INDEX
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
schema
索引を作成するスキーマを指定します。schema
を指定しない場合、自分のスキーマ内に索引が作成されます。
index_ilm_clause
Oracle Databaseリリース20cでは、index_ilm_clause
を使用して、ILMポリシーを索引に追加または削除できます。
ILMポリシーは、ALTER INDEX
文を使用して作成した後、索引に追加することもできます。
ILMポリシーを使用して索引を作成する場合、追加できる新しいポリシーは1つのみです。索引にポリシーを追加したり、索引の既存のポリシーを変更するには、ALTER INDEX
文を使用する必要があります。
ILMポリシーは、索引パーティション・レベルで変更できません。索引レベルの変更は、すべてのパーティションにカスケードされます。
例
CREATE INDEX [schema.]empno_idx ILM_POLICY
制限事項
ILMポリシーはクラスタ索引およびIOTに追加できません。
ILMポリシーはドメイン索引およびビットマップ索引に追加できません。
policy_clause
OPTIMIZE
索引ポリシーは、ポリシー条件が満たされている場合に適切な処理を選択します。
ILMポリシーは、同じスキーマ内のオブジェクトに作成できます。
ILMポリシーを別の表領域に移動する場合、ILMポリシーで示されているすべての表領域に対して必要な権限があることを確認する必要があります。
また、ストレージ階層化ジョブのターゲット表領域に必要な記憶域があることも確認する必要があります。
cluster_index_clause
cluster_index_clause
を使用すると、クラスタ索引を作成するクラスタを指定できます。clusterをschema
で修飾しない場合、そのクラスタは自分のスキーマ内にあるとみなされます。ハッシュ・クラスタにはクラスタ索引を作成できません。
関連項目:
「CREATE CLUSTER」および「クラスタ索引の作成: 例」を参照してください。
table_index_clause
索引を定義する表を指定します。table
をschema
で修飾しない場合、その表は自分のスキーマにあるとみなされます。
ネストした表の記憶表に索引を作成することによって、ネストした表の列に索引を作成します。記憶表のNESTED_TABLE_ID
疑似列を組み込んだUNIQUE
索引を作成することは、ネストした表の値を持つ行がそれぞれ確実に異なるようにする有効な手段です。
関連項目:
セッションがバインドされていない場合にのみ、一時表で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
を指定できません。 -
一時表には、ドメイン索引またはパーティション索引は作成できません。
-
-
外部表に索引を作成することはできません。
関連項目:
一時表の詳細は、「CREATE TABLE」および『Oracle Database概要』を参照してください。
t_alias
索引を作成する表に対して相関名(別名)を指定します。
ノート:
index_expr
がオブジェクト型属性またはオブジェクト型メソッドを参照する場合、この別名が必要になります。「型メソッドのファンクション索引の作成: 例」および「置換可能な列の索引の作成: 例」を参照してください。
index_expr
index_expr
では、索引のベースとなる列または列式を指定します。
次の条件を満たしている場合には、同じ列のセット、同じ列式のセットまたはその両方に、複数の索引を作成できます。
-
索引の種類が異なる場合、索引に異なるパーティション化を使用する場合、または索引に異なる一意のプロパティがある場合。
-
常に
VISIBLE
である索引が1つのみである場合。
関連項目:
複数の索引の作成の詳細は、『Oracle Database管理者ガイド』を参照してください。
column
表内の1つ以上の列の名前を指定します。ビットマップ索引には最大30列を指定できます。他の索引には最大32列を指定できます。これらの列は索引キーを定義します。
一意索引がローカル非同一キー索引(「local_partitioned_index」を参照)の場合、索引キーはパーティション・キーを含んでいる必要があります。
関連項目:
同一キー索引および非同一キー索引の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。
スカラー・オブジェクト属性列またはネストした表の記憶表のシステム定義のNESTED_TABLE_ID
列には索引を作成できます。オブジェクト属性列を指定する場合、列名を表名で修飾する必要があります。ネストした表の列属性を指定する場合は、この属性は、一番外側の表の名前、ネストした表が定義されている列の名前、およびそのネストした表の列属性となるすべての中間属性の名前で修飾する必要があります。
BINARY
以外の宣言または導出された名前付き照合を使用して、あるいは宣言または導出された疑似照合USING_NLS_SORT_CI
やUSING_NLS_SORT_AI
を使用して列または式に索引を作成する場合、ファンクションNLSSORT
に対してファンクション索引が作成されます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
拡張データ型の列に対する索引の作成
column
が拡張データ型列の場合は、索引を作成しようとすると、「最大キー長を超過しました」というエラーが通知されることがあります。索引の最大キー長は、データベース・ブロック・サイズと、ブロック内に格納された追加の索引メタデータによって異なります。たとえば、Oracle標準の8Kのブロック・サイズを使用するデータベースでは、最大キー長は約6400バイトです。
この状況を回避するには、索引付けする値の長さを次のいずれかの方法で短くする必要があります。
-
ファンクション索引を作成し、その索引定義に使用される式の一部である拡張データ型の列に格納される値を短くします。
-
仮想列を作成して、その仮想列定義に使用される式の一部である拡張データ型の列に格納される値を短くし、その仮想列で通常の索引を構築します。仮想列の使用時には、統計の収集や制約およびトリガーの使用など、通常の索引用の機能を活用することもできます。
どちらの方法でも、SUBSTR
またはSTANDARD_HASH
ファンクションを使用して拡張データ型の列の値を短くし、索引を構築できます。これらの方法には、次のメリットとデメリットがあります。
-
SUBSTR
ファンクションを使用すると、索引キーに許容される長さのcolumn
のサブストリングまたは接頭辞が返されます。このタイプの索引は、元の列に対する等価性、INリストおよび範囲述語用に使用できます。この場合、述語の一部としてSUBSTR
列を指定する必要はありません。詳細は、「SUBSTR」を参照してください。 -
STANDARD_HASH
ファンクションを使用した場合、サブストリングを基にした索引よりも縮小された索引が作成される可能性があり、その結果、索引への不要なアクセスが減少することがあります。このタイプの索引は、元の列に対する等価性およびINリスト述語用に使用できます。この場合、述語の一部としてSTANDARD_HASH
列を指定する必要はありません。詳細は、「STANDARD_HASH」を参照してください。
次の例は、拡張データ型の列にファンクション索引を作成する方法を示しています。
CREATE INDEX index ON table (SUBSTR(column, 1, n));
nには、column
のそれぞれの値を区別するために十分な接頭辞の長さを指定します。
次の例は、拡張データ型の列の仮想列を作成し、その後この仮想列に索引を作成する方法を示しています。
ALTER TABLE table ADD (new_hash_column AS (STANDARD_HASH(column))); CREATE INDEX index ON table (new_hash_column);
関連項目:
拡張データ型の詳細は、「拡張データ型」を参照してください。
索引列の制限事項
索引列には、次の制限事項が適用されます。
-
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
疑似列は指定できません。
関連項目:
「CREATE FUNCTION」および『Oracle Database PL/SQL言語リファレンス』を参照してください。
ASC | DESC
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
パラメータを指定できません。
関連項目:
これらの句の詳細は、「physical_attributes_clause」および「storage_clause」を参照してください。
TABLESPACE
tablespace
には、索引、索引パーティションまたは索引サブパーティションを格納する表領域の名前を指定します。この句を指定しない場合、その索引を定義しているスキーマの所有者のデフォルトの表領域内に索引が作成されます。
ローカル索引の場合、tablespace
のかわりにキーワードDEFAULT
を指定できます。ローカル索引に追加される新規パーティションまたはサブパーティションは、基礎となる表の対応するパーティションまたはサブパーティションと同じ表領域内に作成されます。
index_compression
index_compression
句を使用すると、索引の索引圧縮を有効化または無効化できます。prefix_compression
のCOMPRESS
句を指定して索引の接頭辞圧縮を有効化するか、advanced_index_compression
のCOMPRESS
ADVANCED
句を指定して索引の拡張索引圧縮を有効化するか、prefix_compression
またはadvanced_index_compression
のNOCOMPRESS
句を指定して索引の圧縮を無効化します。デフォルトはNOCOMPRESS
です。
パーティション索引の圧縮を使用する場合は、索引レベルで圧縮を有効にして索引を作成する必要があります。そのようなパーティション索引の個々のパーティションの圧縮設定は、後で有効および無効にすることができます。個々のパーティションを再作成するときに圧縮を有効および無効にできます。索引の再作成時にのみ、既存の非パーティション索引を変更して圧縮を有効化または無効化できます。
COMPRESS
を指定すると、キー列値の重複を排除する接頭辞圧縮(キー圧縮とも呼ばれます)を有効化できます。integer
を使用して、接頭辞の長さ(圧縮する接頭辞列数)を指定します。一意でない索引または2列以上の一意索引に、接頭辞圧縮を指定できます。
-
一意の索引の場合、接頭辞の長さの有効範囲は、1からキー列の数から1を引いた数までです。デフォルトの接頭辞の長さは、(キー列の数-1)です。
-
一意でない索引の場合、接頭辞の長さの有効範囲は、1からキー列の数までです。デフォルトの接頭辞の長さはキー列数です。
advanced_index_compression
この句を指定すると拡張索引圧縮を有効化できます。拡張索引圧縮では、索引の効率的なアクセスを維持しながら圧縮率を大幅に向上します。このため、拡張索引圧縮は、接頭辞圧縮の適切な候補ではない索引を含むすべてのサポートされている索引で正常に動作します。
-
COMPRESS
ADVANCED
LOW
- このレベルでは、索引をHIGH
レベル未満で圧縮しますが、索引へのアクセスは高速化されます。この句は、一意でない索引または2列以上の一意索引に指定できます。COMPRESS
ADVANCED
LOW
を有効化する前に、データベースの互換性レベルが12
.1
.0
以上である必要があります。 -
COMPRESS
ADVANCED
HIGH
- このレベルでは、索引をLOW
レベル超で圧縮しますが、索引へのアクセスは低速になります。この句は、一意でない索引または1列以上の一意索引に指定できます。COMPRESS
ADVANCED
HIGH
を有効化する前に、データベースの互換性レベルが12
.2
.0
以上である必要があります。
LOW
およびHIGH
キーワードを省略した場合、HIGH
がデフォルトになります。
索引圧縮の制限事項
索引圧縮には、次の制限事項が適用されます。
-
ビットマップ索引に接頭辞圧縮または拡張索引圧縮は指定できません。
-
索引構成表に拡張索引圧縮を指定できません。
関連項目:
-
索引の作成で圧縮属性を継承する方法の詳細は、DB_INDEX_COMPRESSION_INHERITANCEを参照してください
-
接頭辞圧縮および拡張索引圧縮の詳細は、『Oracle Database管理者ガイド』を参照してください。
-
「索引の圧縮: 例」を参照してください。
partial_index_clause
この句は、パーティション表に索引を作成する場合にのみ指定できます。INDEXING
FULL
を指定すると、全索引を作成できます。INDEXING
PARTIAL
を指定すると、部分索引を作成できます。デフォルトは、INDEXING
FULL
です。
全索引には、索引付けのプロパティとは関係なく、基になる表のすべてのパーティションが含まれます。部分索引には、基になる表で索引付けのプロパティがON
のパーティションのみが含まれます。
部分索引がローカル・パーティション索引の場合、索引付けプロパティがON
の表パーティションに対応する索引パーティションには、USABLE
のマークが付けられます。索引付けプロパティがOFF
の表パーティションに対応する索引パーティションには、UNUSABLE
のマークが付きます。
基になる表がコンポジット・パーティション表の場合は、索引パーティションと表パーティションについての前述の条件が、索引サブパーティションと表サブパーティションに適用されます。
部分索引の制限事項
部分索引には、次の制限事項があります。
-
部分索引の基になる表は、非パーティション表にすることはできません。
-
一意索引は、部分索引することができません。これは、
CREATE
UNIQUE
INDEX
文で作成された索引と、1つ以上の列に一意制約を指定して暗黙的に作成された索引に適用されます。
関連項目:
索引付けプロパティの詳細は、CREATE
TABLE
の「indexing_clause」を参照してください。
SORT | NOSORT
デフォルトでは、索引は作成時に昇順でソートされます。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
操作中に暗黙的に追加されたローカル索引パーティションまたはサブパーティションに対するデフォルト値
索引のロギング属性は、その実表の属性に依存しません。
この句を指定しない場合、ロギング属性は表が存在する表領域の属性になります。
関連項目:
-
この句の詳細は、「logging_clause」を参照してください。
-
ロギングおよびパラレルDMLの詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。
-
「NOLOGGINGモードでの索引の作成: 例」を参照してください。
ONLINE
ONLINE
を指定すると、索引作成中の表でのDML操作を許可できます。
オンライン索引の作成の制限事項
オンライン索引の作成には、次の制限事項があります。
-
オンライン索引の作成中は、パラレルDMLはサポートされません。
ONLINE
を指定し、パラレルDML文を発行すると、Oracle Databaseはエラーを戻します。 -
COMPATIBLE
を10以上に設定すると、ビットマップ索引またはクラスタ索引にONLINE
を指定できます。 -
UROWID
列の従来索引には、ONLINE
を指定できません。 -
索引構成表の一意でない2次索引の場合、索引構成表内の索引キー列の数と論理ROWIDの主キー列の数の合計は、32以下にする必要があります。論理ROWIDは、索引キーに含まれる列を除外します。
関連項目:
オンライン索引の作成および再作成については、『Oracle Database概要』を参照してください。
parallel_clause
parallel_clause
を指定すると、索引の作成をパラレル化できます。
この句の詳細は、「CREATE
TABLE
」の「parallel_clause」を参照してください。
Index Partitioning句
global_partitioned_index
句およびlocal_partitioned_index
句を使用すると、index
をパーティション化できます。
ブロック・サイズが異なる表領域のパーティション化されたデータベース・エンティティの記憶域には、制限事項があります。これらの制限事項については、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。
関連項目:
annotations_clause
注釈句のセマンティクスの詳細は、「annotations_clause」を参照してください。
global_partitioned_index
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
またはinmemory_clause
は指定できませんが、index_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
local_partitioned_index
句を使用すると、table
と同じパーティション数および同じパーティション境界を使用し、同じ列で索引をパーティション化できます。コンポジット・パーティション表では、この句を使用すると、table
と同じパーティション数および同じパーティション境界を使用し、同じ列で索引をパーティション化できます。基礎となる表が再パーティション化された場合、ローカル索引のパーティションは自動的に保持されます。
キーワードLOCAL
のみを指定して、副次句を指定しない場合、Oracle Databaseは対応する表パーティションとして、同じ表領域に各索引パーティションを作成し、対応する表パーティションと同じ名前を割り当てます。表
がコンポジット・パーティション表である場合、Oracle Databaseは対応する表サブパーティションとして、同じ表領域に各索引パーティションを作成して、対応する表サブパーティションと同じ名前を割り当てます。
パーティション名を指定する場合は、スキーマ・オブジェクトのネーミング規則および「データベース・オブジェクトのネーミング規則」にある該当部分の記述に従って指定する必要があります。パーティション名を指定しない場合、対応する表のパーティションと一貫した名前が生成されます。その名前が既存の索引パーティション名と競合する場合は、SYS_P
n
の形式が使用されます。
on_range_partitioned_table
この句を使用すると、レンジ・パーティション表の索引パーティションに名前および属性を指定できます。この句を指定する場合、PARTITION
句は、表パーティションと同一の数と順序である必要があります。
索引に接頭辞圧縮が指定されていない場合、索引パーティションに接頭辞圧縮を指定することはできません。
USABLE
句とUNUSABLE
句の詳細は、「USABLE | UNUSABLE」を参照してください。
on_list_partitioned_table
on_list_partitioned_table
句は、on_range_partitioned_tableと同一です。
on_hash_partitioned_table
この句を使用すると、ハッシュ・パーティション表の索引パーティションに名前および表領域の記憶域を指定できます。
PARTITION
句を指定する場合、これらの句の数は表パーティションの数と同一である必要があります。オプションで、1つ以上の個々のパーティションに表領域の記憶域を指定できます。この句またはSTORE
IN
句に表領域の記憶域を指定しない場合、各索引パーティションが、対応する表パーティションと同じ表領域に格納されます。
STORE
IN
句を使用して、すべての索引ハッシュ・パーティションを分散させる1つ以上の表領域を指定できます。表領域の数は、索引パーティションの数と等しくなる必要はありません。索引パーティションの数が表領域の数より多い場合は、表領域名が繰り返し使用されます。
USABLE
句とUNUSABLE
句の詳細は、「USABLE | UNUSABLE」を参照してください。
on_comp_partitioned_table
この句を使用すると、コンポジット・パーティション表の索引パーティションに名前および属性を指定できます。
STORE
IN
句は、レンジ-ハッシュまたはリスト-ハッシュ・コンポジット・パーティション表に対してのみ有効です。すべてのパーティションのすべての索引ハッシュ・サブパーティションを分散させる1つ以上のデフォルト表領域を指定できます。index_subpartition_clause
の第2 STORE
IN
句で個々のパーティションのサブパーティションに対して異なるデフォルト表領域の記憶域を指定すると、この記憶域を上書きできます。
レンジ-レンジ、レンジ-リストおよびリスト-リスト・コンポジット・パーティション表に対しては、PARTITION
句に指定したレンジまたはリスト・サブパーティションのデフォルトの属性を指定できます。index_subpartition_clause
のSUBPARTITION
句の個々のパーティションのレンジまたはリスト・サブパーティションに異なる属性を指定すると、この記憶域を上書きできます。
索引に接頭辞圧縮が指定されていない場合、索引パーティションに接頭辞圧縮を指定することはできません。
USABLE
句とUNUSABLE
句の詳細は、「USABLE | UNUSABLE」を参照してください。
index_subpartition_clause
この句を使用すると、コンポジット・パーティション表の索引サブパーティションに名前および表領域の記憶域を指定できます。
STORE
IN
句は、レンジ-ハッシュおよびリスト-ハッシュ・コンポジット・パーティション表のハッシュ・サブパーティションに対してのみ有効です。すべての索引ハッシュ・サブパーティションを分散させる1つ以上の表領域を指定できます。SUBPARTITION
句は、すべてのサブパーティション・タイプに対して有効です。
SUBPARTITION
句を指定する場合、これらの句の数は表サブパーティションの数と同一である必要があります。サブパーティション名を指定する場合は、スキーマ・オブジェクトのネーミング規則および「データベース・オブジェクトのネーミング規則」にある該当部分の記述に従って指定する必要があります。subpartition
を指定しない場合、対応する表のサブパーティションと一貫した名前が生成されます。その名前が既存の索引サブパーティション名と競合する場合は、SYS_SUBP
n
の形式が使用されます。
表領域の数は、索引サブパーティションの数と等しくなる必要はありません。索引サブパーティションの数が表領域の数より多い場合は、表領域名が繰り返し使用されます。
on_comp_partitioned_table
句またはindex_subpartition_clause
にサブパーティションの表領域の記憶域を指定しない場合、index
に指定された表領域が使用されます。index
に表領域の記憶域を指定しない場合、サブパーティションが、対応する表サブパーティションと同じ表領域に格納されます。
USABLE
句とUNUSABLE
句の詳細は、CREATE
INDEX
... USABLE | UNUSABLEを参照してください。
domain_index_clause
domain_index_clause
を使用して、index
が、アプリケーション固有のindextype
索引タイプのインスタンスであるドメイン索引であることを示します。
ドメイン索引を作成する前に、複数の操作を行う必要があります。まず、索引タイプの実装タイプを作成します。また、ファンクション実装を作成し、そのファンクションを使用する演算子も作成します。次に、演算子と実装タイプを関連付ける索引タイプを作成します。最後にこの句を使用してドメイン索引を作成します。「詳細な例」に、これらのすべての操作を含んだ単純なドメイン索引の作成例を記載しています。
index_expr
index_expr
(table_index_clause
内)に、索引が定義されている表の列またはオブジェクトの属性を指定します。基礎となる索引タイプが異なり、その索引タイプがユーザー定義操作の分割セットをサポートする場合のみ、1つの列に複数のドメイン索引を定義できます。
ドメイン索引の制限事項
ドメイン索引には、次の制限事項があります。
-
index_expr
(table_index_clause
内)には1つの列のみ指定でき、データ型がREF
、VARRAY、ネストした表、LONG
またはLONG
RAW
の列は指定できません。 -
ビットマップ索引または一意ドメイン索引は作成できません。
-
一時表には、ドメイン索引は作成できません。
-
ローカル・ドメイン索引は、レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表および時間隔パーティション表にのみ作成できますが、例外として、ローカル・ドメイン索引を自動リスト・パーティション表に作成することはできません。
-
ドメイン索引は、照合
BINARY
、USING_NLS_COMP
、USING_NLS_SORT
またはUSING_NLS_SORT_CS
を使用して宣言された表の列に対してのみ作成できます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
indextype
indextype
には、索引タイプの名前を指定します。名前は、作成済の有効なスキーマ・オブジェクトである必要があります。
Oracle Textをインストールしている場合、様々な組込み索引タイプを使用して、Oracle Textドメイン索引を作成できます。Oracle TextおよびOracle Textが使用する索引の詳細は、『Oracle Textリファレンス』を参照してください。
関連項目:
この句を使用すると、索引がパーティション表のローカル索引であることを指定できます。
-
PARTITIONS
句を使用すると、索引パーティションの名前を指定できます。指定するパーティション数は、実表内のパーティション数と一致する必要があります。この句を省略すると、SYS_P
n
という形式のシステム生成の名前でパーティションが作成されます。 -
PARAMETERS
句を使用すると、個々のパーティション固有のパラメータ文字列を指定できます。この句を省略した場合、索引に関連付けられたパラメータ文字列はパーティションにも関連付けられます。
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
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
bitmap_join_index_clause
を使用すると、ビットマップ結合索引を定義できます。ビットマップ結合索引は、単一の表に定義します。ディメンション表の列で構成される索引キーには、そのキーに対応するファクト表のROWIDが格納されます。データ・ウェアハウス環境では、一般的に、索引を定義する表をファクト表といい、ファクト表と結合した表をディメンション表といいます。ただし、結合索引の作成にはスター・スキーマは必須ではありません。
ON
ON
句には、まずファクト表を指定し、次に索引を定義するディメンション表の列をカッコ内に指定します。
FROM
FROM
句には、結合した表を指定します。
WHERE
WHERE
句には、結合条件を指定します。
基礎となるファクト表がパーティション化されている場合、local_partitioned_index
句(「local_partitioned_index」を参照)のいずれかを指定する必要があります。
ビットマップ結合索引の制限事項
一般的なビットマップ索引の制限事項(「BITMAP」を参照)に加え、ビットマップ結合索引には次の制限事項が適用されます。
-
一時表にはビットマップ結合索引は作成できません。
-
FROM
句で表を2回指定できません。 -
ファンクション結合索引は作成できません。
-
ディメンション表の列は、主キー列であるか、または一意制約を含む必要があります。
-
ディメンション表が複合主キーを含む場合、主キーの各列は結合の一部である必要があります。
-
ファクト表がパーティション化されていない場合は、
local_partitioned_index
句を指定できません。 -
ビットマップ結合索引定義では、照合
BINARY
、USING_NLS_COMP
、USING_NLS_SORT
またはUSING_NLS_SORT_CS
を含む列のみを参照できます。これらのいずれかの照合について索引キーが照合され、結合条件がBINARY
照合を使用して評価されます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
USABLE | UNUSABLE
USABLE
キーワードとUNUSABLE
キーワードは、次の項目に指定できます。
-
CREATE
INDEX
文内の索引 -
on_range_partitioned_table
句、on_list_partitioned_table
句、on_hash_partitioned_table
句、およびon_comp_partitioned_table
句内の索引パーティション -
index_subpartition_clause
内の索引サブパーティション
非パーティション索引の場合、UNUSABLE
を指定すると、使用禁止状態で索引を作成できます。使用禁止の索引を使用可能にする場合、再構築するか、または削除して再作成する必要があります。USABLE
を指定すると、使用可能状態で索引を作成できます。USABLE
は、デフォルトです。
パーティション索引の場合は、次のようにUSABLE
またはUNUSABLE
を指定します。
-
この索引に
UNUSABLE
を指定すると、すべての索引パーティションにUNUSABLE
のマークが付きます。 -
この索引に
USABLE
を指定すると、すべての索引パーティションにUSABLE
のマークが付きます。 -
この索引に
USABLE
またはUNUSABLE
を指定していないと、すべての索引パーティションにUSABLE
のマークが付きます。ただし、ローカルの部分索引を除きます。LOCAL
句とINDEXING
PARTIAL
句を指定するときに、USABLE
またはUNUSABLE
を省略すると、各索引パーティションには、それに対応する表パーティションの索引付けプロパティがON
の場合にUSABLE
のマークが付けられ、対応する表パーティションの索引付けプロパティがOFF
の場合にUNUSABLE
のマークが付けられます。
前述の条件は、特定の索引パーティションにUSABLE
またはUNUSABLE
を指定することで上書きできます。
基になる表がコンポジット・パーティション表の場合は、索引パーティションと表パーティションについての前述の条件が、索引サブパーティションと表サブパーティションに適用されます。
パーティション索引の作成後には、特定の索引パーティションまたはサブパーティションをUSABLE
にするように再構築できます。これは、一部の索引パーティションまたはサブパーティションのみで索引を維持する場合に有効です。たとえば、新しいパーティションでは索引アクセスを有効にするものの、古いパーティションでは有効にしない場合などに有効です。
索引または索引の一部のパーティションまたはサブパーティションにUNUSABLE
のマークが付けられている場合は、その使用禁止のオブジェクトにはセグメントは割り当てられません。使用禁止の索引または索引パーティションは、データベース内で領域を使用しません。
索引、または索引の一部のパーティションやサブパーティションにUNUSABLE
のマークが付けられている場合は、2つの条件を満たすときにのみ、索引はオプティマイザによってアクセス・パスとみなされます。1つは、オプティマイザがアクセス対象のパーティションをコンパイル時に認識していること、もう1つは、アクセス対象のすべてのパーティションにUSABLE
のマークが付けられていることです。そのため、問合せにバインド変数を含めることはできません。
USABLE | UNUSABLEの制限事項
索引にUSABLE
またはUNUSABLE
のマークを付ける場合は、次の制限事項が適用されます。
-
この句は、一時表の索引に対して指定できません。
-
次の状況では、使用禁止の索引または索引パーティションにもセグメントが割り当てられます。
-
索引(または索引パーティション)が
SYS
、SYSTEM
、PUBLIC
、OUTLN
またはXDB
によって所有されている場合 -
索引(または索引パーティション)がディクショナリ管理表領域に格納されている場合
-
パーティションのメンテナンス操作が行われているため、パーティション表のグローバル・パーティション索引または非パーティション索引が使用禁止になっている場合
-
{ DEFERRED | IMMEDIATE } INVALIDATION
この句を使用すると、索引の作成中に依存カーソルがいつ無効化されるかを制御できます。この場合のセマンティクスは、ALTER
INDEX
文のものと同じです。この句のセマンティクスの詳細は、ALTER
INDEX
のドキュメントの「{ DEFERRED | IMMEDIATE } INVALIDATION」を参照してください。
例
一般的な索引の例
索引の作成: 例
次の文は、サンプル表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;
クラスタ・キーのすべての列にクラスタ索引が自動的に作成されるため、索引列は指定しません。クラスタ索引の場合は、すべての行に索引が付きます。
次の例では、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;
関連項目:
EXISTSNODE and VALUE
ファンクション索引の例
次の例では、ファンクション索引を作成および使用する方法を示します。
ファンクション索引の作成: 例
次の文は、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 (blowout sale)を複数回利用できないようにします。
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 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));
関連項目:
-
books
表を基礎とする型の階層の作成については、『Oracle Database PL/SQL言語リファレンス』を参照してください。 -
ファンクション「TREAT」、「SYS_TYPEID」および照合「IS OF type条件」を参照してください。