ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

ハッシュ索引とソート索引は同じ列に定義できます。その後、使用する問合せのタイプに応じて、Oracle Rdbのオプティマイザにより適切な取得方法が選択されます。たとえば、問合せに完全一致での取得が含まれる場合、オプティマイザではハッシュ索引アクセスが使用されます。問合せに範囲取得が含まれる場合、オプティマイザによりソート索引が使用されます。この方法では2つの索引を保持するため追加のオーバーヘッドが発生します。ただし、迅速に取得できるというメリットと、データ変更のたびに索引を2つ更新するというデメリットを考慮する必要があります。

ハッシュ索引およびソート索引の相対的なメリットの詳細は、『Oracle Rdb7 Guide to Database Design and Definition』を参照してください。

SORTED索引を指定する場合、オプションで索引内のノードの特性を制御するNODE SIZE句、PERCENT FILL句およびUSAGE句を指定できます。

TYPE IS SORTED RANKED

索引がランク付きソート(Bツリー)索引であることを指定します。ランク付きBツリー索引を使用すると、問合せ(特に範囲取得に関連する問合せ)がより最適化されます。Oracle Rdbでは、カーディナリティがより適切に推定され、ディスクI/Oおよびロック競合を削減できます。そのため、ランク付きソート索引の使用をお薦めします。

UNIQUE

索引の各値を一意とする必要があるかどうかを指定するキーワードです。UNIQUEとして定義された索引を含む列に同じ値を2回格納しようすると、2回目の時点でSQLからエラー・メッセージが返され、その値を含む行は格納も変更もされません。これはNULLを含むいずれの値にも適用されます。

UNIQUEを指定すると、SQLによって、その表ですでに索引に重複値が存在しているかどうかがCREATE INDEX文で実行されるときにチェックされます。

USAGE UPDATE

USAGE QUERY

更新集約型のアプリケーションまたは問合せ集約型のアプリケーションに適したPERCENT FILL値を指定します。USAGE UPDATE句では、PERCENT FILL値を70パーセントに設定します。USAGE QUERY句では、PERCENT FILL値を100パーセントに設定します。

WITH LIMIT OF (literal-list)

ASCENDINGが定義されている場合は、特定の記憶域に常駐する索引キーの最大値を指定します。DESCENDINGが定義されている場合は、特定の記憶域に常駐する索引キーに対して最小値が指定されます。索引キーが複数の列で構成されている場合は、各列のリテラル値を指定します。

リスト内のリテラルの数は、USING句の列の数と同じである必要があります。この句を繰り返して、複数の記憶域に索引のエントリをパーティション化します。リテラルのデータ型は列のデータ型と一致する必要があります。文字の列の場合は、リテラルを一重引用符で囲みます。

複数セグメント・キーおよびSTORE USING...WITH LIMIT句を使用して複数セグメント索引を作成する場合、最初のキーの値がすべて同じ値であれば、最初のキーをその値で制限するよう設定します。これにより、各行の格納先とする記憶域が、2番目のキーの値で決定されるようになります。


使用方法


例1: 単純な表の索引の作成

この文では、索引(EMP_EMPLOYEE_ID)に名前が付けられ、索引キーとして機能する列(EMPLOYEE_ID)にも名前が付けられます。

UNIQUE引数が指定されているため、割当て済のID番号をユーザーが格納しようとすると、SQLからエラー・メッセージが返されます。


SQL> CREATE UNIQUE INDEX EMP_EMPLOYEE_ID ON EMPLOYEES
cont>    (EMPLOYEE_ID);

例2: 降順の索引セグメントを指定した索引の作成

この文では、索引(EMP_EMPLOYEE_ID)に名前が付けられ、降順の索引キーとして機能する列(EMPLOYEE_ID DESCENDING)にも名前が付けられます。

DESCENDINGキーワードが指定されているため、キーが降順でソートされます。DESCENDINGまたはASCENDINGを指定しない場合、SQLによってキーは昇順でソートされます。


SQL> CREATE UNIQUE INDEX EMP_EMPLOYEE_ID ON EMPLOYEES
cont>    (EMPLOYEE_ID DESCENDING);

例3: 複数セグメント索引の作成


SQL> CREATE INDEX EMP_FULL_NAME ON EMPLOYEES
cont>     (LAST_NAME,
cont>      FIRST_NAME,
cont>      MIDDLE_INITIAL);

この文では、索引EMP_FULL_NAMEで使用される3つの列に名前を付けます。これら3つの列がSQLによって連結され、複数セグメント索引が作成されます。

例4: 圧縮型数値索引の作成


SQL> CREATE INDEX YEAR1_IND ON DEGREES
cont> (YEAR_GIVEN ASCENDING MAPPING VALUES 1950 TO 1970);

この文では、DEGREES表のYEAR_GIVEN列に昇順の索引セグメントが作成され、年の値が圧縮されます。

例5: 切捨てテキスト索引の作成


SQL> CREATE INDEX COL_NAME_IND ON COLLEGES
cont> (COLLEGE_NAME SIZE IS 20);

この文では、キーとして使用されるCOLLEGE_NAME列のオクテット数が20オクテットを超えないように、圧縮型索引COL_NAME_INDがCOLLEGES表に作成されます。

例6: 均一記憶域でのしきい値を指定した索引の作成


SQL> ALTER DATABASE FILENAME mf_personnel
cont>     ADD STORAGE AREA UNIFORM1 PAGE FORMAT IS UNIFORM;
SQL> ALTER DATABASE FILENAME mf_personnel
cont>     ADD STORAGE AREA UNIFORM2 PAGE FORMAT IS UNIFORM;
SQL> ATTACH 'FILENAME mf_personnel';
SQL> CREATE UNIQUE INDEX EMP_THRESHOLDS ON EMPLOYEES (EMPLOYEE_ID)
cont>     TYPE IS SORTED
cont>     STORE USING (EMPLOYEE_ID)
cont>         IN RDB$SYSTEM (THRESHOLDS ARE (60,75,90))
cont>             WITH LIMIT OF ('00200')
cont>         IN UNIFORM1 (THRESHOLD IS (65))
cont>             WITH LIMIT OF ('00400')
cont>         OTHERWISE IN UNIFORM2
cont>             (THRESHOLD OF (90));
%RDB-W-META_WARN, metadata successfully updated with the reported warning
-RDMS-W-IDXCOLEXIST, an index with this column list already exists
SQL> --
SQL> SHOW INDEX EMP_THRESHOLDS
Indexes on table EMPLOYEES:
EMP_THRESHOLDS                  with column EMPLOYEE_ID
  No Duplicates allowed
  Type is Sorted
  Key suffix compression is DISABLED
  Node size  430
 Store clause:  STORE USING (EMPLOYEE_ID)
        IN RDB$SYSTEM (THRESHOLDS ARE (60,75,90))
            WITH LIMIT OF ('00200')
        IN UNIFORM1 (THRESHOLD IS (65))
            WITH LIMIT OF ('00400')
        OTHERWISE IN UNIFORM2
            (THRESHOLD OF (90))

この文では、STORE句を使用して統一ページ形式の複数の記憶域に索引がパーティション化され、しきい値が適用されます。

例7および例8では、データベースMIA_CHAR_SETの表COLOURSが次のように定義されています。


SQL> CREATE TABLE COLOURS
cont>     (ENGLISH            MCS_DOM,
cont>      FRENCH             MCS_DOM,
cont>      JAPANESE           KANJI_DOM,
cont>      ROMAJI             DEC_KANJI_DOM,
cont>      KATAKANA           KATAKANA_DOM,
cont>      HINDI              HINDI_DOM,
cont>      GREEK              GREEK_DOM,
cont>      ARABIC             ARABIC_DOM,
cont>      RUSSIAN            RUSSIAN_DOM);

例7: オクテットの文字長を使用した単純な表の索引の作成(デフォルト)


SQL> SET CHARACTER LENGTH 'OCTETS';
SQL> CREATE INDEX COLOUR_INDEX ON COLOURS (JAPANESE SIZE IS 4)
cont> TYPE IS SORTED;
SQL> SHOW INDEX COLOUR_INDEX;
Indexes on table COLOURS:
COLOUR_INDEX                    with column JAPANESE
                                size of index key is 4 octets
  Duplicates are allowed
  Type is Sorted

この文では、4オクテットの圧縮型索引キーが作成されます。

例8: CHARACTERS文字長を使用した索引の作成


SQL> SET CHARACTER LENGTH 'CHARACTERS';
SQL> CREATE INDEX COLOUR_INDEX_2 ON COLOURS (JAPANESE SIZE IS 4)
cont> TYPE IS SORTED;
SQL> SHOW INDEX COLOUR_INDEX_2;
Indexes on table COLOURS:
COLOUR_INDEX_2                  with column JAPANESE
                                size of index key is 4 characters
  Duplicates are allowed
  Type is Sorted

この文では、4文字の圧縮型索引キーが作成されます。

例9: 圧縮を有効にする索引の作成

次の例では、索引を作成して最短ランレングス2の圧縮を有効にする方法を示します。


SQL> CREATE INDEX EMP_NDX ON EMPLOYEES
cont> (EMPLOYEE_ID SIZE IS 4)
cont>  ENABLE COMPRESSION (MINIMUM RUN LENGTH 2);
SQL> SHOW INDEX EMP_NDX;
Indexes on table EMPLOYEES:
EMP_NDX                         with column EMPLOYEE_ID
                                size of index key is 4
  Duplicates are allowed
  Type is Sorted
  Compression is ENABLED  (Minimum run length  2)

例10: 索引の属性句の使用


SQL> CREATE UNIQUE INDEX JOB_JOB_CODE
cont> ON JOBS (
cont> JOB_CODE
cont> ASC)
cont> TYPE IS SORTED
cont> THRESHOLDS ARE (75,83,90)
cont> ENABLE COMPRESSION
cont> NOLOGGING
cont> COMMENT IS 'Used for translation of job codes';
%RDB-W-META_WARN, metadata successfully updated with the reported warning
-RDMS-W-DATACMIT, unjournaled changes made; database may not be recoverable
SQL> -- SQL returned this message because the NOLOGGING attribute
SQL> -- was set.

例11: 索引の作成およびデフォルトのノード・サイズの表示


SQL> -- Create a simple table upon which to define
SQL> -- some indexes
SQL>
SQL> CREATE TABLE TEST_INDEX_TABLE
cont>    (A CHAR(70),
cont>     B INTEGER);
SQL>
SQL> -- Default value is 430 bytes
SQL>
SQL> CREATE UNIQUE INDEX TEST_INDEX_DEF
cont>    ON TEST_INDEX_TABLE (A, B)
cont>    TYPE IS SORTED
cont>    USAGE UPDATE;
SQL>
SQL> SHOW TABLE (INDEX) TEST_INDEX_TABLE
Information for table TEST_INDEX_TABLE
TEST_INDEX_DEF                  with column A
                                and column B
  No Duplicates allowed
  Type is Sorted
  Compression is DISABLED
  Node size  430
  Percent fill  70

例12: パーティションの名前付け


SQL> -- Alter mf_personnel database to add three slots
SQL> -- for storage areas and then add three storage areas.
SQL> ALTER DATABASE FILENAME MF_PERSONNEL
cont> RESERVE 3 STORAGE AREAS;
%RDMS-W-DOFULLBCK, full database backup should be done to ensure future recovery
SQL> ALTER DATABASE FILENAME MF_PERSONNEL
cont> ADD STORAGE AREA WAGE_LOW;
SQL> ALTER DATABASE FILENAME MF_PERSONNEL
cont> ADD STORAGE AREA WAGE_MID;
SQL> ALTER DATABASE FILENAME MF_PERSONNEL
cont> ADD STORAGE AREA WAGE_HIGH;
SQL> ATTACH 'FILENAME MF_PERSONNEL.RDB';
SQL> -- Create an index on the JOBS table and name the partitions
SQL> CREATE INDEX WAGE_CLASS_IDX ON JOBS (WAGE_CLASS)
cont> TYPE IS SORTED
cont> STORE USING (WAGE_CLASS)
cont> IN WAGE_LOW (PARTITION WAGE_LOW) WITH LIMIT OF ('1')
cont> IN WAGE_MID (PARTITION WAGE_MID) WITH LIMIT OF ('3')
cont> OTHERWISE IN WAGE_HIGH (PARTITION WAGE_HIGH);

例13: 多数の記憶域にパーティション化された大規模な索引の作成

まず、次のようにデータベース定義を作成します。


SQL> CREATE INDEX ... MAINTENANCE IS ENABLED DEFERRED ...;

次に、各パーティションをパラレル実行で構築するバッチ・ジョブをサブミットします。たとえば、バッチ・ジョブごとに次のようなスクリプトを実行します。


ATTACH 'filename testdatabase';
SET FLAGS 'index_stats';
ALTER INDEX TRANSACTIONS_INDEX BUILD PARTITION PART_1;
COMMIT;

最後に、バッチ・ジョブの完了後、データベース管理者はメンテナンス・モードをENABLED IMMEDIATEに変更して、索引を問合せの使用に対してアクティブにする必要があります。ある手順が失敗した場合(考えられる理由は、リソースの制限や失敗したノード)、BUILD ALL PARTITIONS句を追加できます。


SQL> SET FLAGS 'index_stats';
SQL> SET TRANSLATION READ WRITE RESERVING...FOR EXCLUSIVE WRITES;
SQL> ALTER INDEX ... BUILD ALL PARTITIONS;
SQL> ALTER INDEX ... MAINTENANCE IS ENABLED IMMEDIATE;
SQL> COMMIT;

この体系は、CREATE INDEX文を直接発行することと比較して、いくつか利点があります。