Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (A ~ D)

 

CREATE INDEX 文

この文を使用して、指定されたテーブルまたはマテリアライズド・ビュー上にインデックスを作成します。インデックスによってデータベースのパフォーマンスを改善できます。

構文 1 - テーブルにインデックスを作成する
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX index-name
  ON [ owner.]table-name
    ( column-name [ ASC | DESC ], ...
      | function-name ( argument, ... ] ) AS column-name )
  [ { IN | ON } dbspace-name ]
  [ FOR OLAP WORKLOAD ]
構文 2 - マテリアライズド・ビューにインデックスを作成する
CREATE [ VIRTUAL ] [ UNIQUE ] [ CLUSTERED ] INDEX index-name
  ON [ owner.]materialized-view-name
    ( column-name [ ASC | DESC ], ...)
  [ { IN | ON } dbspace-name ]
  [ FOR OLAP WORKLOAD ]
パラメータ
  • VIRTUAL 句   VIRTUAL キーワードは主に、Index Consultant によって使用されます。実行プランが Index Consultant によって評価されている間と、PLAN 関数が使用されている場合に、仮想インデックスは実際の物理的なインデックスのプロパティを模倣します。仮想インデックスを PLAN 関数と一緒に使用すると、実際のインデックスを作成するという時間とリソースを消費する作業をせずに、インデックスのパフォーマンスへの影響を調べることができます。

    仮想インデックスは、他の接続からは参照できず、その接続が閉じたときに削除されます。仮想インデックスは、クエリの実際の実行プランを評価しているときは使用されないため、パフォーマンスの妨げにはなりません。

    仮想インデックスは、最大 4 カラムまでを扱えます。

    クエリに対するインデックス・コンサルタントの推奨内容の確認インデックス・コンサルタントを参照してください。

  • CLUSTERED 句   CLUSTERED 属性を使用すると、ローはインデックスのキーの順序で格納されます。データベース・サーバはキーの順序を保持しようとしますが、完全なクラスタは保証されません。

    クラスタード・インデックスが存在すると、LOAD TABLE 文はインデックス・キーの順序でローを挿入し、INSERT 文はキーの順序の定義に従って、隣接するローがあるページに新しいローを配置しようとします。

    クラスタード・インデックスの使用を参照してください。

  • UNIQUE 句   UNIQUE 属性によって、インデックス内のすべてのカラムで同じ値を持つローがテーブルまたはマテリアライズド・ビュー内に複数存在しないようにします。各インデックス・キーはユニークであるか、少なくとも 1 つのカラムで NULL を持つ必要があります。

    一意性制約とユニーク・インデックスには違いがあります。ユニーク・インデックスのカラムは NULL を使用できますが、一意性制約のカラムには使用できません。外部キーは、プライマリ・キーまたは一意性制約は参照できますが、ユニーク・インデックスは参照できません。ユニーク・インデックスは NULL の複数のインスタンスを含むことがあるからです。

    プライマリ・キーや、一意性制約のカラムには FLOAT や DOUBLE などの概数値データ型を使用しないことをおすすめします。概数値データ型は、算術演算後の丸め誤差がでます。

  • ASC | DESC 句   降順 (DESC) が明示的に指定されている場合以外、カラムは昇 (増加) 順で格納されます。昇順と降順 ORDER BY の両方に対してインデックスを使います。これはインデックスが昇順であっても降順であっても同様です。しかし、昇順と降順属性を混在させて ORDER BY を実行する場合、インデックスを使うのは同じ昇順と降順属性を使ってインデックスが作成されたときだけです。

  • function-name   function-name 句は、関数でインデックスを作成します。この句は、宣言済みのテンポラリ・テーブルまたはマテリアライズド・ビューでは使用できません。

    この形式の CREATE INDEX 文は、次の操作を実行する際に便利です。

    1. 計算カラム column-name をテーブルに追加します。カラムは、指定された関数である COMPUTE 句と指定された引数を使用して定義されます。指定できる関数の種類に関する制限については、CREATE TABLE 文の COMPUTE 句の説明を参照してください。カラムのデータ・タイプは、関数の結果タイプに基づきます。

    2. テーブルの既存のローに対して計算カラムを移植します。

    3. カラムでインデックスを作成します。

      インデックスを削除しても、対応する計算カラムは削除されません。

      計算カラムの詳細については、計算カラムの使用を参照してください。

  • IN | ON 句   デフォルトで、インデックスはそのテーブルまたはマテリアライズド・ビューと同じデータベース・ファイルの中に置かれます。インデックスを入れる DB 領域名を指定して、別のデータベース・ファイルにインデックスを入れることができます。この機能が便利なのは、主に大規模なデータベースがファイル・サイズの制限を回避する場合、または複数のディスク・デバイスを使用してパフォーマンスの改善が望める場合です。

    新しいインデックスで物理インデックスを既存の論理インデックスと共有できる場合、IN 句は無視されます。

    制限事項の詳細については、SQL Anywhere のサイズと数の制限を参照してください。

  • FOR OLAP WORKLOAD 句   FOR OLAP WORKLOAD を指定すると、データベース・サーバは特定の最適化を実行し、キーに関する統計情報を収集して、OLAP の負荷に関するパフォーマンスを向上させることができます。パフォーマンスの向上は、optimization_workload を OLAP に設定すると特に顕著になります。optimization_workload オプション [データベース]を参照してください。

    OLAP の詳細については、OLAP のサポートを参照してください。

備考

構文 1 はテーブルで使用し、構文 2 はマテリアライズド・ビューで使用します。

SQL Anywhere は物理インデックスと論理インデックスを使用します。物理インデックスは、ディスクに格納される実際のインデックス構造です。論理インデックスは、物理インデックスへの参照です。既存のインデックスに対する物理属性と同じインデックスを作成する場合、データベース・サーバは、既存の物理インデックスを共有する論理インデックスを作成します。通常、作成したインデックスは論理インデックスとして扱われます。論理インデックスの実装に必要な場合、データベース・サーバは物理インデックスを作成します。また、同じ物理インデックスを複数の論理インデックスで共有できます。論理インデックスを使用したインデックスの共有を参照してください。

CREATEINDEX 文は、指定されたテーブルまたはマテリアライズド・ビューの特定のカラムにソートされたインデックスを作成できます。インデックスは、データベースに対して発行されたクエリのパフォーマンスを向上させたり、ORDER BY 句を使用してクエリをソートするときに自動的に使用されます。一度インデックスを作成すると、そのインデックスを検証する (VALIDATE INDEX) とき、変更する (ALTER INDEX) とき、削除する (DROPINDEX) とき以外は、再び参照されることはありません。

  • インデックスの所有者   CREATE INDEX 文ではインデックスの所有者を指定できません。常にテーブルまたはマテリアライズド・ビューの所有者がインデックスの所有者となります。

  • ビュー上のインデックス   マテリアライズド・ビュー上にはインデックスを作成できますが、通常のビューには作成できません。

  • インデックス名のスペース   各インデックスには、特定のテーブルまたはマテリアライズド・ビューに対してユニークな名前を与えます。

  • 排他的使用   CREATE INDEX は、別の接続によって現在使用されているテーブルまたはマテリアライズド・ビューにこの文が影響する場合は常に阻止されます。CREATE INDEX は処理に時間がかかり、データベース・サーバは文が処理されている間は同じテーブルを参照する要求を処理しません。

  • 自動的に作成されたインデックス   SQL Anywhere はプライマリ・キー、外部キー、一意性制約のインデックスを自動的に作成します。これら自動作成インデックスは、テーブルと同じデータベース・ファイルに保持されます。

文またはトランザクションのスナップショットを使用する、WITH HOLD 句を使用して開かれたカーソルがある場合、この文は実行できません。スナップショット・アイソレーションを参照してください。

パーミッション

テーブルまたはマテリアライズド・ビューの所有者であるか、DBA 権限または REFERENCES パーミッションが必要です。

関連する動作

オートコミット。組み込み関数でインデックスを作成すると、チェックポイントが発生します。

カラムの統計情報が更新されます (統計情報が存在しない場合は作成されます)。

参照
標準と互換性
  • SQL/2003   ベンダ拡張。

Employees テーブルで 2 カラムのインデックスを作成します。

CREATE INDEX employee_name_index
ON Employees
( Surname, GivenName );

ProductID カラム用に SalesOrderItems テーブル上でインデックスを作成します。

CREATE INDEX item_prod
ON SalesOrderItems
( ProductID );

SORTKEY 関数を使用して、Products テーブルの Description カラムにインデックスを作成し、Russian 照合に従ってソートします。関連動作として、この文は計算カラム desc_ru をテーブルに追加します。

CREATE INDEX ix_desc_ru
ON Products (
 SORTKEY( Description, 'rusdict' )
 AS desc_ru );