

# `CREATE INDEX`
<a name="create-index-syntax-support"></a>

`CREATE INDEX` は、新しいインデックスを定義します。Aurora DSQL では、インデックスの作成は常に非同期であるため、`ASYNC` キーワードを指定する必要があります。Aurora DSQL が非同期インデックスビルドを実行する方法とそのモニタリング方法については、「[Aurora DSQL の非同期インデックス](working-with-create-index-async.md)」を参照してください。

## サポートされている構文
<a name="create-index-supported-syntax"></a>

```
CREATE [ UNIQUE ] INDEX ASYNC [ [ IF NOT EXISTS ] name ] ON table_name
    ( { column_name | ( expression ) } [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ NULLS [ NOT ] DISTINCT ]
```

## 説明
<a name="create-index-description"></a>

`CREATE INDEX` は、指定されたテーブルの指定された列にインデックスを作成します。インデックスは主にデータベースのパフォーマンスの向上に使用されますが、不適切に使用するとパフォーマンスが低下する可能性があります。

インデックスのキーフィールドは列名として、または括弧で記述された式として指定します。複数のフィールドを指定して、複数列インデックスを作成できます。

インデックスフィールドは、テーブル行の 1 列または複数の列の値から計算される式です。この機能を使用して、基本データの何らかの変換に基づいてデータに高速アクセスできます。例えば、`upper(col)` に基づいて計算されたインデックスにより、`WHERE upper(col) = 'JIM'` 句でインデックスを使用できます。

インデックス定義で使用されるすべての関数と演算子は、不変である必要があります。つまり、結果は引数にのみ依存する必要があり、別のテーブルの内容や現在時刻などの外部の影響には決して依存してはなりません。この制限により、インデックスの動作が明確に定義されます。インデックス式でユーザー定義関数を使用するには、関数を作成する際に必ずその関数を `IMMUTABLE` としてマークしてください。

## パラメータ
<a name="create-index-parameters"></a>

**`UNIQUE`**  
インデックスを作成する際、およびデータが既に存在する場合に、システムがテーブル内の重複した値をチェックするようにします。エントリが重複するようなデータを挿入または更新しようとすると、エラーが発生します。

**`IF NOT EXISTS`**  
同じ名前のリレーションが既に存在する場合は、エラーをスローしません。この場合、通知が発行されます。既存のインデックスは、作成されるはずだったインデックスに必ずしも類似しているわけではありません。`IF NOT EXISTS` が指定されている場合、インデックス名は必須です。

**`INCLUDE`**  
オプションの `INCLUDE` 句は、*非キー*列としてインデックスに含める列のリストを指定します。インデックススキャンの検索条件に非キー列を使用することはできません。Aurora DSQL は、インデックスによって強制される一意性制約または除外制約の適用において、その列を無視します。ただし、インデックスのみのスキャンでは、非キー列をインデックスエントリから直接取得できるため、インデックスのテーブルにアクセスすることなく、非キー列の内容を返すことができます。したがって、非キー列を追加することで、通常は使用できないクエリに対しても、インデックスのみのスキャンが可能になります。  
式はインデックスのみのスキャンでは使用できないため、付加列としてサポートされていません。

**{{name}}**  
作成するインデックスの名前。スキーマ名をここに含めることはできません。Aurora DSQL は、常に親テーブルと同じスキーマにインデックスを作成します。インデックスの名前は、スキーマ内のテーブル、シーケンス、インデックス、ビューなどの他のリレーションの名前とは異なっている必要があります。名前を省略すると、Aurora DSQL は、親テーブルの名前とインデックス対象の列名に基づいて適切な名前を選択します。

**{{table\_name}}**  
インデックスを作成するテーブルの名前 (オプションでスキーマ修飾可) です。

**{{column\_name}}**  
テーブルの列の名前。

**{{式}}**  
テーブルの 1 つ以上の列に基づく式。通常、構文に示すように、式を括弧で囲んで記述する必要があります。ただし、式が関数呼び出しの形式である場合は、括弧を省略できます。

**`NULLS FIRST`**  
null 値が非 null 値よりも前にソートされるように指定します。

**`NULLS LAST`**  
null 値が非 null 値の後にソートされるように指定します。

**`NULLS DISTINCT``NULLS NOT DISTINCT`**  
一意インデックスに対して、null 値が異なる値、つまり等しくない値と見なされるかどうかを指定します。デフォルトでは、これらは異なる値と見なされるため、一意のインデックスは列に複数の null 値を含めることができます。

## 例
<a name="create-index-examples"></a>

テーブル `films` の列 `title` に一意のインデックスを作成します。

```
CREATE UNIQUE INDEX ASYNC title_idx ON films (title);
```

テーブル `films` の列 `title` に列 `director` と `rating` を含む一意のインデックスを作成します。

```
CREATE UNIQUE INDEX ASYNC title_idx ON films (title) INCLUDE (director, rating);
```

式 `lower(title)` に対してインデックスを作成し、大文字と小文字を区別しない効率的な検索を可能にします。

```
CREATE INDEX ASYNC ON films ((lower(title)));
```

この例ではインデックス名を省略しているため、Aurora DSQL が名前を選択します。通常は `films_lower_idx` です。

null 値のソート順をデフォルトとは異なる設定にしてインデックスを作成します。

```
CREATE INDEX ASYNC title_idx_nulls_low ON films (title NULLS FIRST);
```