DVAAWSのサービスを使用した開発
ある開発者はDynamoDBのOrdersテーブル(パーティションキー: OrderId)を運用しています。新たに「CustomerId 単位で、StatusがSHIPPEDの注文だけを作成日時順に取得する」クエリ要件が追加されました。SHIPPED状態の注文は全体の約5%で、ストレージとRCUのコストを最小化したいと考えています。最も効率的な実装はどれですか。
AパーティションキーをCustomerId、ソートキーをCreatedAtとし、Status属性のあるアイテムだけ書き込むLSIを追加する
LSIはベーステーブルと同一のパーティションキーしか使えず、ここではOrderIdに固定されるためCustomerId単位のクエリを構成できません。ソートキーだけ変えても要件のアクセスパターンを満たせず、LSIはテーブル作成時しか追加できない制約もあります。
BStatus='SHIPPED'のアイテムにのみGSIキー属性を書き込むスパースGSIを作成し、CustomerIdをパーティションキー、CreatedAtをソートキーにする
✓ 正解
GSIはキー属性を持つアイテムのみがインデックス化されるスパース特性を持ち、SHIPPEDの5%だけを登録できます。CustomerIdをパーティション、CreatedAtをソートにすることで対象注文を時系列で効率的にクエリでき、ストレージとRCUを最小化できます。
COrdersテーブルをScanし、FilterExpressionでStatus='SHIPPED'かつCustomerIdを指定して絞り込む
Scanはテーブル全アイテムを読み取ってからFilterExpressionを適用するため、対象が5%でも全体分のRCUを消費します。データ量増加に伴い遅延とコストが線形に増え、効率最優先の要件に反します。
D全アイテムを射影したGSIを作成し、クエリ時にFilterExpressionでStatus='SHIPPED'を指定する
全アイテムを射影するGSIはSHIPPED以外も含むためインデックスのストレージが大きくなります。FilterExpressionはインデックス読み取り後の絞り込みで、読み取ったRCUは課金対象となり無駄が生じます。
解説
GSIはインデックスのキー属性を持つアイテムだけが登録されるため、SHIPPED状態のアイテムにのみGSIのパーティションキー/ソートキー属性を書き込めば、約5%のアイテムだけがインデックスに含まれるスパースGSIになります。これによりインデックスのストレージとクエリ時の読み取り対象が最小化され、CustomerIdでパーティション、CreatedAtでソートしたクエリが効率的に実行できます。
選択肢AのLSIはベーステーブルと同じパーティションキー(OrderId)しか持てず、CustomerIdをパーティションキーにできないため要件を満たせない。
選択肢CのScanはテーブル全体を読み取るためRCU消費が大きく非効率。
選択肢Dの全射影GSIはSHIPPED以外のアイテムもインデックスに含まれストレージが増え、FilterExpressionは読み取り後に適用されるためRCUも無駄になる。
ドメイン別正答率・予想スコアでリアルタイムに実力把握
無限ノックでDVAを徹底対策。全問AI生成のオリジナル問題。
無料で演習を始める →