Amazon DynamoDB テーブルのグローバルセカンダリインデックス (GSI) を作成したいと考えていますが、時間がかかっています。
簡単な説明
既存のテーブルに新しいグローバルセカンダリインデックスを追加すると、[IndexStatus] は [CREATING] (作成中) に設定され、[Backfilling] は [true] に設定されます。バックフィルはテーブルから項目を読み取り、それらをインデックスに追加できるかどうかを判断します。インデックスをバックフィルすると、DynamoDB は内部システムキャパシティを使用してテーブルから項目を読み取ります。これにより、インデックス作成の影響が最小限に抑えられ、テーブルの読み取りキャパシティが不足しないようにできます。
グローバルセカンダリインデックスの構築に必要な時間は、複数の要因によって異なります。
- ベーステーブルのサイズ
- インデックスに含めることのできるテーブル内の項目の数
- インデックスに投影された属性の数
- インデックスのプロビジョニングされた書き込みキャパシティー
- インデックス作成時のベーステーブルでの書き込みアクティビティ
- インデックスパーティション間でのデータ分散
作成プロセスを高速化するには、インデックスの書き込みキャパシティーユニット (WCU) の数を増やします。
グローバルセカンダリインデックスは、ベーステーブルから読み取りまたは書き込みキャパシティモードを継承します。テーブルがオンデマンドモードの場合、DynamoDB もオンデマンドモードでインデックスを作成します。この場合、オンデマンドの DynamoDB テーブルは着信トラフィックに基づいてスケールするため、インデックスのキャパシティを増やすことはできません。
解決方法
インデックス作成の進行状況をモニタリングするには、 OnlineIndexPercentageProgress Amazon CloudWatch メトリクスを使用します。
1. DynamoDB コンソールを開きます。
2. ナビゲーションペインで、[Tables] (テーブル) を選択し、リストからテーブルを選択します。
3. [Metrics] (メトリクス) タブを選択します。
4. [View all CloudWatch metrics] (すべての CloudWatch メトリクスを表示) を選択します。
5. 検索ボックスで、OnlineIndexPercentageProgress と入力します。
注: 検索しても結果が返されない場合、メトリクスがデータを投入するまで 1 分ほど待ちます。その後、再試行します。
6. インデックスの名前を選択して、その進捗状況を確認します。
必要な追加の WCU の数を決定します。そのためには、テーブルサイズ (KB) を希望のバックフィル時間で除します。この計算の次の例を参照してください。
例 1
1 GiB (1,074,000 KB) のテーブルがあるとします。バックフィルのプロセスが 10 分 (600 秒) で完了することを望んでいます。したがって、WCU の数は次のように計算されます。
1,074,000 / 600 = 1,790 WCU
例 2
インデックスのサイズを 2 GB とし、インデックスの作成を 1 時間で完了するとします。したがって、WCU の数は次のように計算されます。
(2GB * 1024 * 1024) KB / 60 分 / 60 秒 = ~583 WCU
必要な WCU の数は、インデックスのサイズと見積もった時間によって異なります。
注: これはあくまでも目安です。作成時間は、キーのディストリビューション、項目のサイズ、インデックスに投影される属性の数など、複数の要因によって異なります。
追加の書き込みキャパシティをプロビジョニングするには、次の手順を実行します。
1. DynamoDB コンソールを開きます。
2. ナビゲーションペインで、[Tables] (テーブル) を選択し、リストからテーブルを選択します。
3. [Capacity] (キャパシティ) タブを選択します。
4. インデックスの書き込みキャパシティを増やし、[Save] (保存) を選択します。
5. 約 1 分後、OnlineIndexPercentageProgress メトリクスを調べて、作成速度が向上したかどうかを確認します。
注: 追加の読み取りキャパシティをプロビジョニングする必要はありません。
関連情報
セカンダリインデックスを使用したデータアクセス性の向上
「既存のテーブルへの グローバルセカンダリインデックスの追加」
「グローバルセカンダリインデックスの管理」