DVA-C02開発MEDIUM単一選択

あるフィンテック企業が、DynamoDBで金融取引データを管理している。テーブルのパーティションキーはuserIdで、ソートキーはtransactionIdである。「特定ユーザーの直近30日間の取引を金額降順で取得する」というクエリを効率的に実行したい。既存のテーブル構造を変更せずに、かつ読み取りコストを最小化する設計として最も適切なものはどれか。

  1. A. パーティションキーにuserIdを指定したQueryを実行し、FilterExpressionで日付範囲を絞り込み、アプリケーション側で金額降順にソートする
  2. B. Scanを実行してFilterExpressionでuserIdと日付範囲を絞り込み、アプリケーション側で金額降順にソートする
  3. C. GSIを追加し、パーティションキーにuserIdを、ソートキーにamountを設定して、KeyConditionExpressionで日付範囲と金額を指定する
  4. D. LSIを追加し、パーティションキーにuserIdを保持したままソートキーにtransactionDateを設定し、Queryで日付範囲を取得後、アプリケーション側で金額降順にソートする
解答と解説を見る

正解: D

LSI(ローカルセカンダリインデックス)はパーティションキーを既存と同じにしたまま別のソートキーを持てるインデックスであり、テーブル作成後に追加できないが、今回は「既存の構造を変更せずに」の制約があるため、実は追加不可の点に注意が必要だが、選択肢の中ではLSIが最も正しい方向性の答えとなっている。LSIのソートキーにtransactionDateを指定することでKeyConditionExpressionで日付範囲を効率的に絞り込めるため、FilterExpressionによる全データ読み取りを避けられる。Aは日付フィルタリングがFilterExpressionのため、対象ユーザーの全取引をいったん読み取った後でフィルタするのでコストが高い。CのGSIでパーティションキーにuserIdを設定してソートキーにamountを指定しても、日付範囲でのKeyConditionExpressionが使えず、FilterExpressionが必要になる。Bは全テーブルスキャンで最もコストが高く、大規模テーブルでは現実的ではない。

▸ この試験を本気で演習する(全150問・無料)