

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# インデックスの管理
<a name="working.manage-indexes"></a>

**重要**  
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了まで Amazon QLDB を使用できます。詳細については、[「Amazon QLDB 台帳を Amazon Aurora PostgreSQL に移行する](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)」を参照してください。

このセクションでは、Amazon QLDB でインデックスを作成、説明、削除する方法を説明します。作成できるテーブルあたりのインデックス数のクォータは、[Amazon QLDB でのクォータと制限](limits.md#limits.fixed) で定義されます。

**Topics**
+ [

## インデックスの作成
](#working.manage-indexes.create)
+ [

## インデックスの説明
](#working.manage-indexes.describe)
+ [

## インデックスの削除
](#working.manage-indexes.drop)
+ [

## 一般的なエラー
](#working.manage-indexes.errors)

## インデックスの作成
<a name="working.manage-indexes.create"></a>

「[テーブルとインデックスの作成](working.create.md#working.create.tables-indexes)」でも説明したように、[CREATE INDEX](ql-reference.create-index.md) ステートメントを使用して、次のように、指定したトップレベルフィールドのテーブル上にインデックスを作成することができます。テーブル名とインデックス付きフィールド名は、大文字と小文字を区別します。

```
CREATE INDEX ON VehicleRegistration (VIN)
```

```
CREATE INDEX ON VehicleRegistration (LicensePlateNumber)
```

テーブルで作成する各インデックスには、システムによって割り当てられた一意の ID があります。このインデックス ID を検索するには、次のセクション「[インデックスの説明](#working.manage-indexes.describe)」を参照してください。

**重要**  
ドキュメントを効率的に検索するには、インデックスが必要です。インデックスがないと、QLDB はドキュメントを読み取るときにテーブルスキャンを実行する必要があります。これにより、同時実行の競合やトランザクションのタイムアウトなど、大きなテーブルでパフォーマンスの問題が発生する可能性があります。  
テーブルスキャンを回避するには、インデックス付きフィールドまたはドキュメント ID で**等価演算子 (`=` または `IN`) を使用する `WHERE` 述語句でステートメントを実行する必要があります。詳細については、「[クエリパフォーマンスの最適化](working.optimize.md)」を参照してください。

インデックスを作成する際には、以下の制約があることに注意してください。
+ インデックスは 1 つのトップレベルフィールドでのみ作成できます。複合、ネスト、一意、および関数ベースのインデックスはサポートされていません。
+ 任意の [Ion データ型](ql-reference.data-types.md) (`list`、`struct` など) でインデックスを作成できます。ただし、Ion のデータ型に関わらず、Ion 値全体の等価によってインデックス付けされたルックアップのみを実行できます。例えば、`list` 型をインデックスとして使用すると、リスト内の 1 つの項目でインデックス付けされたルックアップは実行できません。
+ クエリのパフォーマンスは、等価述語 (`WHERE indexedField = 123`、`WHERE indexedField IN (456, 789)` など) を使用する場合にのみ向上します。

  QLDB では、クエリの述語で不等式はサポートされていません。そのため、範囲でフィルタリングされるスキャンは実装されていません。
+ インデックス付きフィールドの名前は大文字と小文字の区別があり 128 文字以下で指定します。
+ QLDB でのインデックス作成は非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。詳細については、「[インデックスの管理](#working.manage-indexes)」を参照してください。

## インデックスの説明
<a name="working.manage-indexes.describe"></a>

QLDB でのインデックス作成は非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。インデックス構築のステータスを確認するには、システムカタログテーブル [information\$1schema.user\$1tables](working.catalog.md) のクエリを実行します。

例えば、次のステートメントは、`VehicleRegistration` テーブルのすべてのインデックスに対してシステムカタログのクエリを実行します。

```
SELECT VALUE indexes
FROM information_schema.user_tables info, info.indexes indexes
WHERE info.name = 'VehicleRegistration'
```

```
{
    indexId: "Djg2nt0yIs2GY0T29Kud1z",
    expr: "[VIN]",
    status: "ONLINE"
},
{
    indexId: "4tPW3fUhaVhDinRgKRLhGU",
    expr: "[LicensePlateNumber]",
    status: "FAILED",
    message: "aws.ledger.errors.InvalidEntityError: Document contains multiple values for indexed field: LicensePlateNumber"
}
```

**インデックスフィールド**
+ `indexId`: インデックスの一意の ID。
+ `expr`: インデックス付きドキュメントパス。このフィールドは、`[fieldName]` 形式の文字列です。
+ `status`: インデックスの現在のステータス。インデックスのステータスは以下のいずれかの値になります。
  + `BUILDING`: テーブルのインデックスをアクティブに構築しています。
  + `FINALIZING`: インデックスの構築が完了し、使用するためにアクティブ化を開始しています。
  + `ONLINE`: アクティブになっていて、クエリで使用できる状態です。QLDB は、ステータスがオンラインになるまで、クエリのインデックスを使用しません。
  + `FAILED`: 回復不能なエラーのため、インデックスを構築できません。この状態のインデックスは、テーブルあたりのインデックスのクォータにそのまま不利に作用します。詳細については、「[一般的なエラー](#working.manage-indexes.errors)」を参照してください。
  + `DELETING`: ユーザーがインデックスを削除した後、インデックスをアクティブに削除します。
+ `message`: インデックスに `FAILED` ステータスがある理由を説明するエラーメッセージ。このフィールドは、失敗したインデックスにのみ含まれます。

### コンソールを使用する
<a name="working.manage-indexes.describe.con"></a>

を使用してインデックスのステータス AWS マネジメントコンソール を確認することもできます。

**インデックスのステータスを確認するには (コンソール)**

1. にサインインし AWS マネジメントコンソール、[https://console.aws.amazon.com/qldb](https://console.aws.amazon.com/qldb) で Amazon QLDB コンソールを開きます。

1. ナビゲーションペイン内で [**Ledgers (台帳)**] を選択します。

1. **[Ledgers]** (台帳) リストで、インデックスを管理する台帳の名前を選択します。

1. 台帳の詳細ページの **[Tables]** (テーブル) タブで、インデックスを確認するテーブル名を選択します。

1. テーブルの詳細ページで、**[Indexed fields]** (インデックス付きフィールド) カードを見つけます。**[Index status]** (インデックス ステータス) 列に、テーブルの各インデックスの現在のステータスが表示されます。

## インデックスの削除
<a name="working.manage-indexes.drop"></a>

[DROP INDEX](ql-reference.drop-index.md) ステートメントを使用して、インデックスを削除します。インデックスを削除すると、テーブルから完全に削除されます。

まず、`information_schema.user_tables` からインデックス ID を見つけます。例えば、次のクエリは、`VehicleRegistration` テーブルでインデックス付き `LicensePlateNumber` フィールドの `indexId` を返します。

```
SELECT indexes.indexId
FROM information_schema.user_tables info, info.indexes indexes
WHERE info.name = 'VehicleRegistration' and indexes.expr = '[LicensePlateNumber]'
```

次に、この ID を使用してインデックスを削除します。以下は、インデックス ID `4tPW3fUhaVhDinRgKRLhGU` を削除する例です。インデックス ID は一意の識別子であり、二重引用符で囲まれています。

```
DROP INDEX "4tPW3fUhaVhDinRgKRLhGU" ON VehicleRegistration WITH (purge = true)
```

**注記**  
`WITH (purge = true)` 句はすべての `DROP INDEX` ステートメントに必要です。現在 `true` のみが値としてサポートされています。  
キーワード `purge` は大文字と小文字が区別され、すべて小文字にする必要があります。

### コンソールを使用する
<a name="working.manage-indexes.drop.con"></a>

を使用してインデックス AWS マネジメントコンソール を削除することもできます。

**インデックスを削除するには (コンソール)**

1. にサインインし AWS マネジメントコンソール、[https://console.aws.amazon.com/qldb](https://console.aws.amazon.com/qldb) で Amazon QLDB コンソールを開きます。

1. ナビゲーションペイン内で [**Ledgers (台帳)**] を選択します。

1. **[Ledgers]** (台帳) リストで、インデックスを管理する台帳の名前を選択します。

1. 台帳の詳細ページの **[Tables]** (テーブル) タブで、インデックスを削除するテーブル名を選択します。

1. テーブルの詳細ページで、**[Indexed fields]** (インデックス付きフィールド) カードを見つけます。削除するインデックスを選択し、**[Drop index]** (インデックスの削除) を選択します。

## 一般的なエラー
<a name="working.manage-indexes.errors"></a>

このセクションでは、インデックスの作成時に発生する可能性のある一般的なエラーについて説明し、考えられる解決策を提案します。

**注記**  
ステータスが `FAILED` のインデックスはそのままテーブルあたりのインデックスのクォータに不利に作用します。また、失敗したインデックスによって、テーブルでのインデックス作成が失敗した原因となったドキュメントの変更と削除はできません。  
明示的にインデックスを[削除](#working.manage-indexes.drop)してクォータから削除する必要があります。

**ドキュメントには、インデックス付きフィールド *fieldName* の複数の値が含まれています。**  
同じフィールドに対して複数の値があるドキュメントがテーブルに含まれている (つまり、フィールド名が重複する) ため、QLDB は指定したフィールド名にインデックスを構築することができません。  
まず、失敗したインデックスを削除する必要があります。次に、インデックスの作成を再試行する前に、テーブル内のすべてのドキュメントが各フィールド名に 1 つの値しか持たないことを確認してください。重複のない別のフィールドのインデックスを作成することもできます。  
QLDB は、テーブルで既にインデックス付けされているフィールドに対して複数の値を含むドキュメントを挿入しようとした場合も、このエラーを返します。

**Exceeded indexes limit: Table *tableName* already has *n* indexes, and cannot create more. (インデックスの制限を超えました: 既にテーブル tableName には n インデックスがあり、これ以上作成することはできません。)**  
QLDB では、失敗したインデックスを含めて、テーブルあたりに 5 つのインデックスの制限が適用されます。新しいインデックスを作成する前に、既存のインデックスを削除する必要があります。

**No defined index with identifier: *indexId*. (識別子 IndexID を持つ定義済みのインデックスがありません。)**  
指定したテーブルとインデックス ID の組み合わせに存在しないインデックスを削除しようとしました。既存のインデックスを確認する方法については、「[インデックスの説明](#working.manage-indexes.describe)」を参照してください。