DynamoDB データの表示、閲覧、編集の方法
DynamoDB テーブルに対する「見る」または「変える」操作はすべて、少数の API 操作 —
GetItem、Query、Scan、PutItem、UpdateItem、DeleteItem — のいずれかに
マッピングされます。その下にリレーショナルなテーブルビューワはありません。
「テーブルを閲覧する」のは文字どおり 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 個の個別の PutItem と DeleteItem リクエストを含める」)、
それぞれ依然として 1 つのキーを対象にします — DELETE … WHERE はありません。
ネスト / JSON データを表示する方法
DynamoDB のアイテムは型タグ付きのワイヤ形式(DynamoDB-JSON)で保存され、すべての値は
1 文字または 2 文字の型記述子(S、N、M、L、SS… — 完全な記述子リストは
AWS のデータ型ドキュメント
にあります)を持ちます。素の JSON にはセット型がないので、配列はリスト(L)として
往復し、決して文字列セット(SS)にはなりません — これは表示のバグではなく本物の変換上の
制限です。完全な型マップは DynamoDB のデータ型にあります。DynamoDB-JSON
のブロブを素の JSON に、またその逆に変換するには
DynamoDB JSON コンバーターを使ってください。
閲覧と編集を超えて: DynamoDB にはできないクエリ
Scan/Query/UpdateItem は表示と編集をカバーしますが、分析 はできません —
DynamoDB には JOIN、GROUP BY、COUNT/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 をダウンロードしてください。