예제로 배우는 DynamoDB PartiQL
은 DynamoDB를 위한 SQL 호환 쿼리 언어입니다. 임시 작업에는 원시 API보다 친근하지만, 같은 엔진 위에서 돌아가므로 익숙한 문법 아래에 똑같은 키 규칙 (그리고 똑같은 비용)이 적용됩니다.
DynamoDB용 PartiQL 쿼리는 어떻게 작성하나요?
PartiQL은 DynamoDB에 SQL 모양의 문 네 가지 — SELECT, INSERT, UPDATE,
DELETE — 를 주고, 이를 ExecuteStatement로 실행합니다. 각각은 아래에서 네이티브
연산으로 컴파일되므로, 로 필터링하면 Query가 되고 그것을
생략하면 테이블 전체 Scan이 됩니다. 쓰기는 여전히 로 항목 하나를
대상으로 하며, 관계형 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— 한 번의 왕복에 최대 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 Workbench는 여러분이
가져온 행에 대해 이를 클라이언트 측에서 실행합니다 — PartiQL이 말하지 못하는 SQL을,
DynamoDB의 액세스 패턴 규칙 안에서요.
PartiQL은 기저 데이터 타입을 바꾸지 않습니다 — 값은 여전히 DynamoDB-JSON으로 전선을 타고 흐르며, 변환기로 살펴볼 수 있습니다.
스키마 인식 자동 완성으로 PartiQL 문을 실행하고 정렬 가능한 테이블 뷰에서 결과를 훑어보려면 DynoTable을 써보세요.