例で学ぶ DynamoDB の PartiQL
PartiQL は DynamoDB のための SQL 互換のクエリ言語です。アドホックな作業では生の API より扱いやすいものの、同じエンジン上で動くため、見慣れた構文の下では同じキーの ルール(と同じコスト)が適用されます。
SELECT
SELECT * FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND begins_with("SK", 'ORDER#')パーティションキーでフィルタすれば、これは Query です。パーティションキーを
省く と、PartiQL は静かにテーブル全体の Scan を実行します
— 同じ落とし穴が、SELECT * の裏に隠れているだけです。
INSERT
INSERT INTO "AppData" VALUE {'PK': 'CUSTOMER#42', 'SK': 'PROFILE', 'plan': 'pro'}UPDATE
UPDATE "AppData" SET "plan" = 'enterprise'
WHERE "PK" = 'CUSTOMER#42' AND "SK" = 'PROFILE'DELETE
DELETE FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND "SK" = 'ORDER#2026-001'インデックスをクエリする
FROM 句でインデックス名を使います。
SELECT * FROM "AppData"."GSI1" WHERE "GSI1PK" = 'STATUS#OPEN'WHERE は IN、contains()、begins_with() もサポートします。
SELECT * FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND "SK" IN ['ORDER#1', 'ORDER#2']パラメータ化された文
値をインラインにする代わりに ? プレースホルダーを使ってください — 引用符付けや
インジェクションの問題を回避し、SDK に型のマーシャリングを任せられます。
SELECT * FROM "AppData" WHERE "PK" = ? AND begins_with("SK", ?)Parameters: [{ S: 'CUSTOMER#42' }, { S: 'ORDER#' }] を ExecuteStatement に
渡します。
バッチとトランザクション
BatchExecuteStatement— 1回のラウンドトリップで最大 25 文。より高速 ですが、アイテム間のアトミック性はありません(各文が個別に成功または失敗します)。ExecuteTransaction— 最大 100 文、全か無か です。複数の書き込みが まとめてコミットされなければならないときに使います。
PartiQL の落とし穴
PartiQL は SQL の ように見えます が DynamoDB エンジン上で動くため、SQL の習慣が 裏目に出ます。
- 単一の
UPDATE/DELETEは、完全なプライマリキーで 1つの アイテムを対象に しなければなりません —UPDATE … WHERE status = 'x'のような一括更新はありません (代わりにバッチでループします)。 JOINもGROUP BYも集計(COUNT/SUM/AVG)もありません。 PartiQL vs SQL を参照。- パーティションキーを省くと、どんな
SELECTもテーブル全体の Scan になります — 制限するのは請求額だけです。
本当に JOIN、GROUP BY、または集計が必要になったとき、DynoTable の SQL Workbench
は、あなたが取得した行に対してクライアント側でそれらを実行します — PartiQL が
話せない SQL を、DynamoDB のアクセスパターンのルールの範囲内で。
PartiQL は基盤となる データ型 を変えません — 値は依然として DynamoDB-JSON としてワイヤーを流れ、コンバーター で確認できます。
DynoTable を試す と、自動補完付きで PartiQL 文を実行し、各文が消費する 読み取りユニットを確認できます。