예제로 보는 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", ?)ExecuteStatement에 Parameters: [{ S: 'CUSTOMER#42' }, { S: 'ORDER#' }]을 전달하세요.
배치와 트랜잭션
BatchExecuteStatement— 한 번의 왕복에 최대 25개 문장. 더 빠르지만 항목 간 원자성은 없습니다(각각 독립적으로 성공하거나 실패).ExecuteTransaction— 최대 100개 문장, 전부 아니면 전무. 여러 쓰기가 함께 커밋되어야 할 때 사용하세요.
PartiQL의 함정
PartiQL은 SQL 처럼 보이지만 DynamoDB 엔진에서 실행되므로 SQL 습관이 역효과를 냅니다:
- 단일
UPDATE/DELETE는 전체 기본 키로 하나의 항목을 대상으로 해야 합니다 —UPDATE … WHERE status = 'x'같은 대량 업데이트는 없습니다(대신 배치로 루프를 도세요). JOIN도,GROUP BY도, 집계(COUNT/SUM/AVG)도 없습니다. PartiQL 대 SQL을 참조하세요.- 파티션 키를 생략하면 어떤
SELECT든 전체 테이블 Scan으로 바뀝니다 — 오직 청구서로만 제한됩니다.
JOIN, GROUP BY, 집계가 정말로 필요할 때, DynoTable의 SQL 워크벤치는 여러분이 가져온 행 위에서 그것들을 클라이언트 측으로 실행합니다 — PartiQL이 말할 수 없는 SQL을 DynamoDB의 액세스 패턴 규칙 안에서 실행합니다.
PartiQL은 기본 데이터 타입을 바꾸지 않습니다 — 값은 여전히 DynamoDB-JSON으로 와이어를 통해 전달되며, 이는 변환기로 확인할 수 있습니다.
DynoTable을 사용해 자동 완성과 함께 PartiQL 문장을 실행하고 각 문장이 소비하는 읽기 단위를 확인하세요.