日本語PDF

13.17 CREATE INDEX

目的

CREATE INDEX文を使用すると、次のものに索引を作成できます。

  • 表の1つ以上の列、パーティション表、索引構成表またはクラスタ

  • 表またはクラスタの1つ以上のスカラー型オブジェクト属性

  • ネストした表の列の索引を作成するためのネストした表の記憶表

索引は、表またはクラスタの索引列に表示されるそれぞれの値のエントリが含まれるスキーマ・オブジェクトであり、行に対する直接かつ高速のアクセスを提供します。単一の索引エントリの最大サイズは、データベースのブロック・サイズによって異なります。

Oracle Databaseは次のタイプの索引をサポートしています。

  • 通常の索引。(デフォルトではBツリー索引が作成されます。)

  • ビットマップ索引。キー値に関連付けられたROWIDをビットマップとして格納します。

  • パーティション索引。表の索引付き列に表示される各値のエントリを含むパーティションで構成されます。

  • ファンクション索引。式をベースとしています。式によって戻される値を評価する問合せを構成できます。その式には、組込みファンクションまたはユーザー定義ファンクションを含めることができます。

  • ドメイン索引。アプリケーション固有のindextype索引タイプのインスタンスです。

注意:

前提条件

自分のスキーマ内に索引を作成する場合は、次のいずれかの条件が満たされている必要があります。

  • 索引を作成する表またはクラスタが自分のスキーマ内に定義されている。

  • 索引を作成する表に対するINDEXオブジェクト権限を持っている。

  • CREATE ANY INDEXシステム権限を持っている。

他のユーザーのスキーマ内に索引を作成する場合は、CREATE ANY INDEXシステム権限が必要です。また、索引が定義されているスキーマの所有者には、UNLIMITED TABLESPACEシステム権限、あるいはその索引または索引パーティションを格納するための表領域の割当て制限のいずれかが必要です。

ファンクション索引を作成する場合は、従来索引の作成の前提条件の他に、索引がユーザー定義ファンクションに基づいている場合は、ファンクションにDETERMINISTICのマークを付ける必要があります。ファンクション索引は、索引の所有者の資格証明を使用して実行されるため、索引の所有者には、ファンクションに対するEXECUTEオブジェクト権限が必要です。

自分のスキーマにドメイン索引を作成する場合、従来索引の作成の前提条件の他に、索引タイプに対するEXECUTEオブジェクト権限が必要です。他のユーザーのスキーマにドメイン索引を作成する場合、索引の所有者にも索引タイプおよびその基礎となる実装タイプに対するEXECUTEオブジェクト権限が必要です。ドメイン索引を作成する前に、索引タイプを定義する必要があります。

関連項目:

CREATE INDEXTYPE

構文

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開発者ガイド』を参照してください。)

individual_hash_partitions::=

(read_only_clauseおよびindexing_clauseは、table_index_clausepartitioning_storage_clause::=ではサポートされていません。)

partitioning_storage_clause::=

(TABLESPACE SETtable_compressioninmemory_clauseおよびilm_clauseは、CREATE INDEXindex_compression::=LOB_partitioning_storage::=ではサポートされていません。)

LOB_partitioning_storage::=

(TABLESPACE SET: CREATE INDEXではサポートされていません)

hash_partitions_by_quantity::=を参照

segment_attributes_clause::=

(physical_attributes_clause::=TABLESPACE SET: CREATE INDEXではサポートされていません、logging_clause::=)

on_hash_partitioned_table::=

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列を指定できます。

関連項目:

schema

索引を作成するスキーマを指定します。schemaを指定しない場合、自分のスキーマ内に索引が作成されます。

index

作成する索引の名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。

関連項目:

「索引の作成: 例」および「XMLType表の索引の作成例:」を参照してください。

cluster_index_clause

cluster_index_clauseを使用すると、クラスタ索引を作成するクラスタを指定できます。clusterをschemaで修飾しない場合、そのクラスタは自分のスキーマ内にあるとみなされます。ハッシュ・クラスタにはクラスタ索引を作成できません。

関連項目:

「CREATE CLUSTER」および「クラスタ索引の作成: 例」を参照してください。

table_index_clause

索引を定義する表を指定します。tableschemaで修飾しない場合、その表は自分のスキーマにあるとみなされます。

ネストした表の記憶表に索引を作成することによって、ネストした表の列に索引を作成します。記憶表のNESTED_TABLE_ID疑似列を組み込んだUNIQUE索引を作成することは、ネストした表の値を持つ行がそれぞれ確実に異なるようにする有効な手段です。

セッションがバインドされていない場合にのみ、一時表でDDL操作(ALTER TABLEDROP TABLECREATE INDEXなど)を実行できます。セッションを一時表にバインドするには、一時表でINSERT操作を実行します。セッションを一時表からアンバインドするには、TRUNCATE文を発行するか、セッションを終了します。また、トランザクション固有の一時表からアンバインドするには、COMMITまたはROLLBACK文を発行します。

table_index_clauseの制限事項

この句には、次の制限事項があります。

  • indexがローカル・パーティション索引の場合は、tableをパーティション化する必要があります。

  • tableが索引構成表の場合、この文は2次索引を作成します。この索引には、索引構成表の索引キーおよび論理ROWIDが含まれます。論理ROWIDは、索引キーにも含まれる列を除外します。この2次索引には、REVERSEを指定できません。索引キーおよび論理ROWIDの結合サイズは、ブロック・サイズ未満にする必要があります。

  • tableが一時表の場合、indextableと同様の有効範囲(セッションまたはトランザクション)を持つ一時的なものとなります。一時表の索引には、次の制限があります。

    • index_propertiesで指定できるのは、index_attributesの部分のみです。

    • index_attributesでは、physical_attributes_clauseparallel_clauselogging_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_CIUSING_NLS_SORT_AIを使用して列または式に索引を作成する場合、ファンクションNLSSORTに対してファンクション索引が作成されます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

拡張データ型の列に対する索引の作成

columnが拡張データ型列の場合は、索引を作成しようとすると、「最大キー長を超過しました」というエラーが通知されることがあります。索引の最大キー長は、データベース・ブロック・サイズと、ブロック内に格納された追加の索引メタデータによって異なります。たとえば、Oracle標準の8Kのブロック・サイズを使用するデータベースでは、最大キー長は約6400バイトです。

この状況を回避するには、索引付けする値の長さを次のいずれかの方法で短くする必要があります。

  • ファンクション索引を作成し、その索引定義に使用される式の一部である拡張データ型の列に格納される値を短くします。

  • 仮想列を作成して、その仮想列定義に使用される式の一部である拡張データ型の列に格納される値を短くし、その仮想列で通常の索引を構築します。仮想列の使用時には、統計の収集や制約およびトリガーの使用など、通常の索引用の機能を活用することもできます。

どちらの方法でも、SUBSTRまたはSTANDARD_HASHファンクションを使用して拡張データ型の列の値を短くし、索引を構築できます。これらの方法には、次のメリットとデメリットがあります。

  • SUBSTRファンクションを使用すると、索引キーに許容される長さのcolumnのサブストリングまたは接頭辞が返されます。このタイプの索引は、元の列に対する等価性、INリストおよび範囲述語用に使用できます。この場合、述語の一部としてSUBSTR列を指定する必要はありません。詳細は、「SUBSTR」を参照してください。

  • STANDARD_HASHファンクションを使用した場合、サブストリングを基にした索引よりも縮小された索引が作成される可能性があり、その結果、索引への不要なアクセスが減少することがあります。このタイプの索引は、元の列に対する等価性およびINリスト述語用に使用できます。この場合、述語の一部としてSUBSTR列を指定する必要はありません。詳細は、「STANDARD_HASH」を参照してください。

次の例は、拡張データ型の列にファンクション索引を作成する方法を示しています。

CREATE INDEX index ON table (SUBSTR(column, 0, 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型の列または属性の索引を除き、ユーザー定義型、LONGLONG 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_INDEXEStrueに設定しないかぎり、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_expressionTO_NUMBERTO_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で指定するファンクションは、リピータブル値を戻す必要があります。たとえば、SYSDATEUSERファンクションまたは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_compressionCOMPRESS句を指定して索引の接頭辞圧縮を有効化するか、advanced_index_compressionCOMPRESS ADVANCED句を指定して索引の拡張索引圧縮を有効化するか、prefix_compressionまたはadvanced_index_compressionNOCOMPRESS句を指定して索引の圧縮を無効化します。デフォルトはNOCOMPRESSです。

パーティション索引の圧縮を使用する場合は、索引レベルで圧縮を有効にして索引を作成する必要があります。そのようなパーティション索引の個々のパーティションの圧縮設定は、後で有効および無効にすることができます。個々のパーティションを再作成するときに圧縮を有効および無効にできます。索引の再作成時にのみ、既存の非パーティション索引を変更して圧縮を有効化または無効化できます。

prefix_compression

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がデフォルトになります。

索引圧縮の制限事項

索引圧縮には、次の制限事項が適用されます。

  • ビットマップ索引に接頭辞圧縮または拡張索引圧縮は指定できません。

  • 索引構成表に拡張索引圧縮を指定できません。

関連項目:

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操作中に暗黙的に追加されたローカル索引パーティションまたはサブパーティションに対するデフォルト値

索引のロギング属性は、その実表の属性に依存しません。

この句を指定しない場合、ロギング属性は表が存在する表領域の属性になります。

関連項目:

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およびパーティショニング・ガイド』を参照してください。

関連項目:

パーティション索引の例

global_partitioned_index

global_partitioned_indexを使用すると、索引のパーティション化がユーザー定義であり、基礎となる表と同一レベルでパーティション化されないことを指定できます。デフォルトでは、非パーティション索引はグローバル索引です。

グローバル索引には、レンジ・パーティション化またはハッシュ・パーティション化を実行できます。どちらの場合でも、パーティション・キー列に最大32列を指定できます。列リストをパーティション化する場合、索引の列リストの左の接頭辞を指定する必要があります。索引が列abおよびcに定義されている場合は、列に(a, b, c)、(a, b)または(a, c)は指定できますが、(b, c)(c)または(b, a)は指定できません。パーティション名を指定する場合は、スキーマ・オブジェクトのネーミング規則および「データベース・オブジェクトのネーミング規則」にある該当部分の記述に従って指定する必要があります。パーティション名を省略すると、SYS_Pnの形式で名前が生成されます。

GLOBAL PARTITION BY RANGE

この句を使用すると、レンジ・パーティション・グローバル索引を作成できます。列リストに指定した表の列の値の範囲に基づいて、グローバル索引がパーティション化されます。

GLOBAL PARTITION BY HASH

この句を使用すると、ハッシュ・パーティション・グローバル索引を作成できます。パーティション・キー列の値にハッシュ・ファンクションを使用して、行がパーティションに割り当てられます。

関連項目:

ハッシュ・パーティションの2つの方法の詳細は、「CREATE TABLE」句の「hash_partitions」および「ハッシュ・パーティション・グローバル索引の作成: 例」を参照してください。

グローバル・パーティション索引の制限事項

グローバル・パーティション索引には、次の制限事項があります。

  • パーティション・キー列リストには、ROWID類似列またはROWID型の列は指定できません。

  • ハッシュ・パーティションに指定できるプロパティは、表領域の記憶域のみです。そのため、individual_hash_partitionspartitioning_storage_clauseにLOBまたはVARRAYの記憶域句を指定できません。

  • hash_partitions_by_quantityOVERFLOW句は、索引構成表のパーティションに対してのみ指定できます。

  • partitioning_storage_clauseでは、table_compressionまたはinmemory_clauseは指定できませんが、index_compressionは指定できます。

注意:

異なるキャラクタ・セットを使用してデータベースを使用しているか、使用する予定がある場合は、キャラクタ列を分割する際に注意してください。文字のソート順序は、すべてのキャラクタ・セットで同一ではありません。

関連項目:

キャラクタ・セット・サポートの詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

index_partitioning_clause

この句を使用すると、個々の索引パーティションを記述できます。この句が繰り返される数によってパーティションの数が決まります。partitionを指定しない場合、名前はSYS_Pnの形式で生成されます。

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_Pnの形式が使用されます。

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_clauseSUBPARTITION句の個々のパーティションのレンジまたはリスト・サブパーティションに異なる属性を指定すると、この記憶域を上書きできます。

索引に接頭辞圧縮が指定されていない場合、索引パーティションに接頭辞圧縮を指定することはできません。

USABLE句とUNUSABLE句の詳細は、「USABLE | UNUSABLE」を参照してください。

index_subpartition_clause

この句を使用すると、コンポジット・パーティション表の索引サブパーティションに名前および表領域の記憶域を指定できます。

STORE IN句は、レンジ-ハッシュおよびリスト-ハッシュ・コンポジット・パーティション表のハッシュ・サブパーティションに対してのみ有効です。すべての索引ハッシュ・サブパーティションを分散させる1つ以上の表領域を指定できます。SUBPARTITION句は、すべてのサブパーティション・タイプに対して有効です。

SUBPARTITION句を指定する場合、これらの句の数は表サブパーティションの数と同一である必要があります。サブパーティション名を指定する場合は、スキーマ・オブジェクトのネーミング規則および「データベース・オブジェクトのネーミング規則」にある該当部分の記述に従って指定する必要があります。subpartitionを指定しない場合、対応する表のサブパーティションと一貫した名前が生成されます。その名前が既存の索引サブパーティション名と競合する場合は、SYS_SUBPnの形式が使用されます。

表領域の数は、索引サブパーティションの数と等しくなる必要はありません。索引サブパーティションの数が表領域の数より多い場合は、表領域名が繰り返し使用されます。

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の列は指定できません。

  • ビットマップ索引または一意ドメイン索引は作成できません。

  • 一時表には、ドメイン索引は作成できません。

  • ローカル・ドメイン索引は、レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表および時間隔パーティション表にのみ作成できますが、例外として、ローカル・ドメイン索引を自動リスト・パーティション表に作成することはできません。

  • ドメイン索引は、照合BINARYUSING_NLS_COMPUSING_NLS_SORTまたはUSING_NLS_SORT_CSを使用して宣言された表の列に対してのみ作成できます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

indextype

indextypeには、索引タイプの名前を指定します。名前は、作成済の有効なスキーマ・オブジェクトである必要があります。

Oracle Textをインストールしている場合、様々な組込み索引タイプを使用して、Oracle Textドメイン索引を作成できます。Oracle TextおよびOracle Textが使用する索引の詳細は、『Oracle Textリファレンス』を参照してください。

関連項目:

CREATE INDEXTYPE

local_domain_index_clause

この句を使用すると、索引がパーティション表のローカル索引であることを指定できます。

  • PARTITIONS句を使用すると、索引パーティションの名前を指定できます。指定するパーティション数は、実表内のパーティション数と一致する必要があります。この句を省略すると、SYS_Pnという形式のシステム生成の名前でパーティションが作成されます。

  • 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

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句を指定できません。

  • ビットマップ結合索引定義では、照合BINARYUSING_NLS_COMPUSING_NLS_SORTまたはUSING_NLS_SORT_CSを含む列のみを参照できます。これらのいずれかの照合について索引キーが照合され、結合条件がBINARY照合を使用して評価されます。詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。

注意:

ファクト表とディメンション表、およびデータ・ウェアハウス環境でのビットマップ索引の使用については、『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のマークを付ける場合は、次の制限事項が適用されます。

  • この句は、一時表の索引に対して指定できません。

  • 次の状況では、使用禁止の索引または索引パーティションにもセグメントが割り当てられます。

    • 索引(または索引パーティション)がSYSSYSTEMPUBLICOUTLNまたはXDBによって所有されている場合

    • 索引(または索引パーティション)がディクショナリ管理表領域に格納されている場合

    • パーティションのメンテナンス操作が行われているため、パーティション表のグローバル・パーティション索引または非パーティション索引が使用禁止になっている場合

{ DEFERRED | IMMEDIATE } INVALIDATION

この句を使用すると、索引の作成中に依存カーソルがいつ無効化されるかを制御できます。この場合のセマンティクスは、ALTER INDEX文のものと同じです。この句のセマンティクスの詳細は、ALTER INDEXのドキュメントの「{ DEFERRED | IMMEDIATE } INVALIDATION」を参照してください。

一般的な索引の例

索引の作成: 例

次の文は、サンプル表oe.orderscustomer_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;

関連項目:

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_idpromotion_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_01tbs_02tbs_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));

関連項目: