例で学ぶ DynamoDB の PartiQL
は DynamoDB 向けの SQL 互換クエリ言語です。アドホックな作業では生の API より 親しみやすいものの、同じエンジン上で動作するため、おなじみの構文の下で同じキーのルール(そして 同じコスト)が適用されます。
DynamoDB 向けの PartiQL クエリはどう書くのか?
PartiQL は DynamoDB に 4 つの SQL 形式のステートメント — SELECT、INSERT、UPDATE、DELETE — を、
ExecuteStatement を通して提供します。それぞれが下層でネイティブ操作にコンパイルされるため、
でフィルタすれば Query のままですが、それを省くとテーブル全体の
Scan になります。書き込みは依然としてで 1 アイテムをターゲットにします。
リレーショナルな JOIN、GROUP BY、集計はありません。
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 ステートメントを実行し、 ソート可能なテーブルビューで結果を閲覧できます。