CREATE INDEX文は、範囲索引またはビットマップ索引を表またはマテリアライズド・ビューの1つ以上の列に作成し、新しい索引に名前を割り当てます。
必要な権限
表またはマテリアライズド・ビューの所有者に必要な権限はありません。
別のユーザーの表またはマテリアライズド・ビューの場合、INDEXが必要です。
SQL構文
CREATE [UNIQUE|BITMAP] INDEX [Owner.]IndexName ON [Owner.]TableName ({ColumnName [ASC | DESC]} [, ... ] )
パラメータ
CREATE INDEX文には、次のパラメータがあります。
説明
UNIQUEまたはBITMAPを指定しない場合、TimesTenでは範囲索引が作成されます。
各列でビットマップ索引を指定すると、AND演算子またはOR演算子で連結された複数の列で複数の条件を指定する複雑な問合せのパフォーマンスが向上します。 実行時に、TimesTenでは、各条件を満たす行のビットマップが検出され、様々な条件のビットマップがビット単位論理演算子を使用して結合され、その結果生成されるビットマップが条件を満たす行に変換されます。
ビットマップ索引は、次の条件を満たすために使用されます。
等価条件。 例: 'x1 = 1'
範囲条件。 例: 'y1 > 10'および'z1 BETWEEN 1 and 10'
AND条件。 例: 'x1 > 10 AND y1 > 10'
OR条件。 例: 'x1 > 10 OR y1 > 10'
ANDまたはORを含む複雑な条件。 例: '(x1 > 10 AND y1 > 10) OR (z1 > 10)'
ANDを含むNOT EQUAL条件。 例: 'x1 = 1 and y1 != 1'
ビットマップ索引の特徴は次のとおりです。
COUNT (*)最適化では、ビットマップからROWIDがカウントされます。
ビットマップ索引の列の接頭辞によってグループ化する問合せを最適化するために使用されます。
異なる問合せおよび順序を問合せによって最適化するために使用されます。
MERGE結合で使用されます。
CREATE INDEX文は、索引の定義をシステム・カタログに追加して、必要なデータ構造を初期化します。表の行はすべて索引に追加されます。TimesTenでは、表を作成し、索引を指定してからデータを追加した場合と、表を作成し、データを追加してから索引を指定した場合のパフォーマンスの違いはありません。
UNIQUEを指定した場合、索引付けされた列の既存の行の値はすべて一意である必要があります。
新しい索引は、DROP INDEX文を使用して索引を削除するか、その索引に関連付けられた表を削除しないかぎり自動的にメンテナンスされます。
準備された文が新しく索引付けされた表を参照している場合、その文を次回に実行する際に自動的に再度準備されます。これにより、文は新しい索引を活用することができます。
他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表に索引を作成することはできません。
言語比較を使用する場合は、言語索引を作成できます。言語索引ではソート・キー値が使用され、ソート・キー値用の記憶域が必要です。 1つの索引に指定できるNLS_SORTの値は、一意の値を1つのみです。 言語索引および言語比較の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の言語索引の使用の説明を参照してください。
冗長な索引を作成すると、TimesTenにより警告またはエラーが生成されます。 ttRedundantIndexCheckをコールして、表に対する冗長な索引のリストを表示します。
例
表を作成し、次に表でビットマップ索引を作成します。 ttIsql SHOWPLANコマンドを使用して、ビットマップ索引が問合せで使用されていることを確認します。
Command> CREATE TABLE tab1 (id NUMBER); Command> INSERT INTO tab1 VALUES (10); 1 row inserted. Command> INSERT INTO tab1 VALUES (20); 1 row inserted. Command> CREATE BITMAP INDEX bitmap_id ON tab1 (id); Command> COMMIT; Command> SET AUTOCOMMIT OFF; Command> SHOWPLAN 1; Command> SELECT * FROM tab1 WHERE id = 10; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkBitmapScan TBLNAME: TAB1 IXNAME: BITMAP_ID INDEXED CONDITION: TAB1.ID = 10 NOT INDEXED: <NULL> < 10 > 1 row found.
HRスキーマのregions表により、region_idに一意の索引が作成されます。 regions表に対してttIsql INDEXESコマンドを発行します。 一意の範囲索引regionsが表示されます。
Command> INDEXES REGIONS;
Indexes on table SAMPLEUSER.REGIONS:
REGIONS: unique range index on columns:
REGION_ID
(referenced by foreign key index COUNTR_REG_FK on table SAMPLEUSER.COUNTRIES)
1 index found.
1 table found.
regions表に一意の索引iを作成し、region_id列に索引を作成してみます。 警告メッセージが表示されます。
Command> CREATE UNIQUE INDEX i ON regions (region_id); Warning 2232: New index I is identical to existing index REGIONS; consider dropping index I
ttRedundantIndexCheckをコールして、この索引に対する警告メッセージを表示します。
Command> CALL ttRedundantIndexCheck ('regions');
< Index SAMPLEUSER.REGIONS.I is identical to index SAMPLEUSER.REGIONS.REGIONS; consider dropping index SAMPLEUSER.REGIONS.I >
1 row found.
redundancy表を作成し、col1列およびcol2列を定義します。 col1およびcol2に2つのユーザー索引を作成します。 2つ目の索引r2を作成しようとするとエラー・メッセージが表示されます。 索引r1は作成されます。 索引r2は作成されません。
Command> CREATE TABLE redundancy (col1 CHAR (30), col2 VARCHAR2 (30)); Command> CREATE INDEX r1 ON redundancy (col1, col2); Command> CREATE INDEX r2 ON redundancy (col1, col2); 2231: New index R2 would be identical to existing index R1 The command failed.
redundancy表に対してttIsqlコマンドのINDEXESを発行し、索引r1のみが作成されていることを表示します。
Command> INDEXES redundancy;
Indexes on table SAMPLEUSER.REDUNDANCY:
R1: non-unique range index on columns:
COL1
COL2
1 index found.
1 table found.
この一意索引によって、部品の番号はすべて一意になります。
CREATE UNIQUE INDEX purchasing.partnumindex ON purchasing.parts (partnumber);
employees1表に、german_indexという名前の言語索引を作成します。2つ以上の言語ソートが必要な場合は、2つ目の言語索引を作成します。
Command> CREATE TABLE employees1 (id CHARACTER (21),
id2 character (21));
Command> CREATE INDEX german_index ON employees1
(NLSSORT(id, 'NLS_SORT=GERMAN'));
Command> CREATE INDEX german_index2 ON employees1
NLSSORT(id2, 'nls_sort=german_ci'));
Command> indexes employees1;
Indexes on table SAMPLEUSER.EMPLOYEES1:
GERMAN_INDEX: non-unique range index on columns:
NLSSORT(ID,'NLS_SORT=GERMAN')
GERMAN_INDEX2: non-unique range index on columns:
NLSSORT(ID2,'nls_sort=german_ci')
2 indexes found.
1 table found.
関連項目