初級読了 1 分

例で学ぶ DynamoDB の PartiQL

は DynamoDB 向けの SQL 互換クエリ言語です。アドホックな作業では生の API より 親しみやすいものの、同じエンジン上で動作するため、おなじみの構文の下で同じキーのルール(そして 同じコスト)が適用されます。

DynamoDB 向けの PartiQL クエリはどう書くのか?

PartiQL は DynamoDB に 4 つの SQL 形式のステートメント — SELECTINSERTUPDATEDELETE — を、 ExecuteStatement を通して提供します。それぞれが下層でネイティブ操作にコンパイルされるため、 でフィルタすれば Query のままですが、それを省くとテーブル全体の Scan になります。書き込みは依然としてで 1 アイテムをターゲットにします。 リレーショナルな JOINGROUP 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'

WHEREINcontains()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' のような一括更新はありません(代わりにバッチで ループします)。
  • JOINGROUP BY も集計(COUNT/SUM/AVG)もありません。 PartiQL vs SQL を参照してください。
  • パーティションキーを省くと、任意の SELECT がテーブル全体の Scan になります — 制限は請求額だけです。

本当に JOINGROUP BY、集計が必要になったとき、DynoTable の SQL Workbench は、あなたが取得した 行に対してクライアント側でそれらを実行します — PartiQL には話せない SQL を、DynamoDB のアクセス パターンのルール内で。

PartiQL は下層のデータ型を変えません — 値は依然として DynamoDB-JSON として ワイヤ上を送られ、コンバータで確認できます。

DynoTable を試すと、スキーマを認識した自動補完で PartiQL ステートメントを実行し、 ソート可能なテーブルビューで結果を閲覧できます。

更新日