インデックスの管理 - Amazon Quantum Ledger Database (Amazon QLDB)

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

インデックスの管理

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

インデックスの作成

テーブルとインデックスの作成」でも説明したように、CREATE INDEX ステートメントを使用して、次のように、指定したトップレベルフィールドのテーブル上にインデックスを作成することができます。テーブル名とインデックス付きフィールド名は、大文字と小文字を区別します。

CREATE INDEX ON VehicleRegistration (VIN)
CREATE INDEX ON VehicleRegistration (LicensePlateNumber)

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

重要

ドキュメントを効率的に検索するには、インデックスが必要です。インデックスがないと、QLDB はドキュメントを読み取るときにテーブルスキャンを実行する必要があります。これにより、同時実行の競合やトランザクションのタイムアウトなど、大きなテーブルでパフォーマンスの問題が発生する可能性があります。

テーブルスキャンを回避するには、インデックス付きフィールドまたはドキュメント ID で等価演算子 (= または IN) を使用する WHERE 述語句でステートメントを実行する必要があります。詳細については、「クエリパフォーマンスの最適化」を参照してください。

インデックスを作成する際には、以下の制約があることに注意してください。

  • インデックスは 1 つのトップレベルフィールドでのみ作成できます。複合、ネスト、一意、および関数ベースのインデックスはサポートされていません。

  • 任意の Ion データ型 (liststruct など) でインデックスを作成できます。ただし、Ion のデータ型に関わらず、Ion 値全体の等価によってインデックス付けされたルックアップのみを実行できます。例えば、list 型をインデックスとして使用すると、リスト内の 1 つの項目でインデックス付けされたルックアップは実行できません。

  • クエリのパフォーマンスは、等価述語 (WHERE indexedField = 123WHERE indexedField IN (456, 789) など) を使用する場合にのみ向上します。

    QLDB では、クエリの述語で不等式はサポートされていません。そのため、範囲でフィルタリングされるスキャンは実装されていません。

  • インデックス付きフィールドの名前は大文字と小文字の区別があり 128 文字以下で指定します。

  • QLDB でのインデックス作成は非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。詳細については、「インデックスの管理」を参照してください。

インデックスの説明

QLDB でのインデックス作成は非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。インデックス構築のステータスを確認するには、システムカタログテーブル information_schema.user_tables のクエリを実行します。

例えば、次のステートメントは、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: 回復不能なエラーのため、インデックスを構築できません。この状態のインデックスは、テーブルあたりのインデックスのクォータにそのまま不利に作用します。詳細については、「一般的なエラー」を参照してください。

    • DELETING: ユーザーがインデックスを削除した後、インデックスをアクティブに削除します。

  • message: インデックスに FAILED ステータスがある理由を説明するエラーメッセージ。このフィールドは、失敗したインデックスにのみ含まれます。

AWS Management Console を使用してインデックスのステータスを確認することもできます。

インデックスのステータスを確認するには (コンソール)
  1. AWS Management Console にサインインして、Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。

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

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

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

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

インデックスの削除

DROP INDEX ステートメントを使用して、インデックスを削除します。インデックスを削除すると、テーブルから完全に削除されます。

まず、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 は大文字と小文字が区別され、すべて小文字にする必要があります。

AWS Management Console を使用してインデックスを削除することもできます。

インデックスを削除するには (コンソール)
  1. AWS Management Console にサインインして、Amazon QLDB コンソール (https://console.aws.amazon.com/qldb) を開きます。

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

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

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

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

一般的なエラー

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

注記

ステータスが FAILED のインデックスはそのままテーブルあたりのインデックスのクォータに不利に作用します。また、失敗したインデックスによって、テーブルでのインデックス作成が失敗した原因となったドキュメントの変更と削除はできません。

明示的にインデックスを削除してクォータから削除する必要があります。

ドキュメントには、インデックス付きフィールド 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 の組み合わせに存在しないインデックスを削除しようとしました。既存のインデックスを確認する方法については、「インデックスの説明」を参照してください。