初級読了 2 分

DynamoDB データの表示、閲覧、編集の方法

DynamoDB テーブルに対する「見る」または「変える」操作はすべて、少数の API 操作 — GetItemQueryScanPutItemUpdateItemDeleteItem — のいずれかに マッピングされます。その下にリレーショナルなテーブルビューワはありません。 「テーブルを閲覧する」のは文字どおり Scan であり、「行を編集する」のはプライマリキーに 対する UpdateItem です。各クリックがどの操作にマッピングされるかを知ることが、安価な 読み取りと、意図しなかったフルテーブルスキャンの違いになります。

DynoTable はまさにこれらの操作の上の GUI です — 実行しようとしているのがどの操作で、 コストがいくらかを、ワイヤに届く前に見せてくれます。

DynamoDB テーブルを閲覧する方法

「中に何があるか見る」ためにテーブルを開くのは Scan です — テーブルまたはインデックス 内のすべてのアイテムを読み取ります(AWS: 「Amazon DynamoDB の Scan 操作は、テーブルまたはセカンダリインデックス内のすべての アイテムを読み取る」)。小さなテーブルなら問題ありません。大きなテーブルでは query vs scan で扱う古典的なコストの落とし穴です。

1 回の Scan は最大 1 MB のデータを返し、その後に次のページを取得するための LastEvaluatedKey を渡します — つまり「テーブル全体を閲覧」は実際にはページネーション ループです(AWS: 「1 回の Scan リクエストは最大 1 MB のデータを取得できる」、そして「Scan レスポンスの LastEvaluatedKey を次の Scan リクエストの ExclusiveStartKey として使うべき」)。 カーソルの仕組みと、なぜここにオフセット式のページ番号が存在しないのかについては ページネーションを参照してください。

DynamoDB データをフィルタ / スキャンする方法

落とし穴: フィルタ式はスキャンを節約しません。DynamoDB は読み取りが完了した に フィルタを適用するので、保持する行だけでなく、スキャンしたすべてのアイテムに課金されます。

フィルタ式は、Scan が終了した後、結果が返される前に適用されます。したがって、 フィルタ式の有無に関わらず、Scan は同じ量の読み取りキャパシティを消費します。 — AWS Scan ドキュメント

レスポンスがこれを可視化します。ScannedCount は「ScanFilter が適用される前に評価された アイテムの数」で、Count はフィルタを生き残ったものです (AWS)。 高い ScannedCount と小さな Count は、非効率なスキャンの特徴です。

DynamoDB テーブルをクエリする方法

Query は安価で的を絞った読み取りです — ただしパーティションキーが必要です。 AWSより: 「パーティションキー属性の名前と、その属性の単一の値を提供する必要がある。Query は そのパーティションキー値を持つすべてのアイテムを返す。任意で、ソートキー属性を提供し、 比較演算子を使って検索結果を絞り込める。」

つまり Query は 1 つのパーティションキーの下のアイテムだけを読み取り、任意でソートキー 条件で絞り込みます — テーブル全体を読むことはありません。パーティションキーがなければ Query はなく、Scan に逆戻りです。その選択は DynamoDB で最も重要なコストの決定です。 完全な内訳は query vs scan にあります。

プレースホルダ構文を手で書かずに KeyConditionExpression / FilterExpression を組み立てる には、DynamoDB 式ビルダーを使ってください — API が 期待する正確な名前 / 値のマップを出力します。

DynamoDB のアイテムを編集する方法

1 つのアイテムを編集するのは、その完全なプライマリキーに対する UpdateItem です。 アイテム全体を書き直すのではなく、変更する属性だけを指名する 更新式 を提供します。

UpdateItem
  Key:              { "PK": "USER#42", "SK": "PROFILE" }
  UpdateExpression: SET email = :e, updatedAt = :t

人をつまずかせる 2 つの事実、どちらも AWS のアイテムドキュメントより:

  • プライマリキーの一部ではなく全体を指定する必要があります。 複合キーテーブルでは、 パーティションキー ソートキーです。任意の属性で「行を編集」することはできません — それにはまずキーを見つけるためのスキャンが必要です。
  • UpdateItem はアップサートです。 「指定したキーのアイテムが存在しない場合、 UpdateItem は新しいアイテムを作成する。そうでなければ、既存のアイテムの属性を変更する。」 キーのタイプミスは、エラーになる代わりに黙って新しいアイテムを作成します。

アイテムを削除する方法

DeleteItem で、これもまた完全なプライマリキーで指定します: 「DeleteItem は指定したキーのアイテムを削除する」 (AWS)。 編集と同じルール — 完全なキーが必要なので、「status が 'open' のすべての行」を削除するのは 1 回の呼び出しではありません。スキャン / クエリしてキーを見つけ、それぞれを削除します。 BatchWriteItem は最大 25 個の put/delete リクエストをまとめますが (AWS: 「BatchWriteItem 操作は最大 25 個の個別の PutItemDeleteItem リクエストを含める」)、 それぞれ依然として 1 つのキーを対象にします — DELETE … WHERE はありません。

ネスト / JSON データを表示する方法

DynamoDB のアイテムは型タグ付きのワイヤ形式(DynamoDB-JSON)で保存され、すべての値は 1 文字または 2 文字の型記述子(SNMLSS… — 完全な記述子リストは AWS のデータ型ドキュメント にあります)を持ちます。素の JSON にはセット型がないので、配列はリスト(L)として 往復し、決して文字列セット(SS)にはなりません — これは表示のバグではなく本物の変換上の 制限です。完全な型マップは DynamoDB のデータ型にあります。DynamoDB-JSON のブロブを素の JSON に、またその逆に変換するには DynamoDB JSON コンバーターを使ってください。

閲覧と編集を超えて: DynamoDB にはできないクエリ

Scan/Query/UpdateItem は表示と編集をカバーしますが、分析 はできません — DynamoDB には JOINGROUP BYCOUNT/SUM のような集計関数がなく、 PartiQL でもそれらは追加されません。その SELECT 文法は SELECT … FROM table [WHERE …] [ORDER BY …] にすぎず、結合やグループ化の句はありません (AWS PartiQL SELECT リファレンス)。 そのため各文は単一の Get/Query/Scan/Put/Update/Delete にマッピングされます。DynoTable の SQL Workbench は、テーブルを DynamoDB の本物のクエリランタイムを通してマテリアライズし、 その上で SQL を実行することでそのギャップを埋めます — DynamoDB のアクセスパターンの ルール内での SQL です — が、日々の閲覧と編集には上記の操作が道具箱のすべてです。

FAQ

AWS コンソールなしで DynamoDB データを表示するには? 同じ Scan/Query 呼び出しを発行するデスクトップ GUI を使います。AWS コンソールはページ化 されたスキャンでテーブルを閲覧します。DynoTable のような専用クライアントは同じことを しますが、消費キャパシティと実行している操作を見せてくれます。

DynamoDB のアイテムを編集するには? 変更する属性だけを指名する SET 更新式とともに、アイテムの完全なプライマリキーに対して UpdateItem を発行します。GUI ではセルをインライン編集します — それがその UpdateItem に コンパイルされます。

なぜフィルタしてもフルスキャンのコストがかかる? DynamoDB がスキャンでアイテムを読み取った にフィルタを適用するからです。フィルタで 除外されたアイテムも読み取られ課金されます。コストを削るには、スキャンする代わりに パーティションキー(または GSI)でクエリしてください。

一度に多くのアイテムを更新できる? 1 回の呼び出しではできません。UpdateItem/DeleteItem はそれぞれ単一のプライマリキーを 対象にします。UPDATE … WHERE はありません。スキャン / クエリでキーを集め、それぞれを 書き込みます(BatchWriteItem ごとに最大 25 個)。

DynamoDB Local のテーブルも同じように閲覧できる? はい — 同じ GUI をローカルエンドポイントに向けます。 DynamoDB Local を参照してください。

DynamoDB テーブルを閲覧、フィルタ、インライン編集し — PartiQL にできない SQL を実行したい ですか? DynoTable をダウンロードしてください。

更新日