입문6분 분량

DynamoDB용 SQL과 PartiQL의 한계

DynamoDB는 NoSQL 키-값 저장소이지만 SQL 관련 질문에 더 많은 답변을 제공합니다. 사람들이 기대하는 것보다 훨씬 적습니다. 이것이 정직한 지도입니다. SQL-on-DynamoDB는 실제로 바로 사용할 수 있으며, 중지되는 경우와 몇 가지 방법이 있습니다. JOIN / GROUP BY / 집계 쿼리를 실행하려면 기본 표면에서는 할 수 없습니다. 표현하다.

SQL로 DynamoDB를 쿼리할 수 있나요?

부분적으로. DynamoDB는 SQL 호환 언어인 를 제공합니다. SELECT/INSERT/UPDATE/DELETE를 키로 선택하므로 SELECT * FROM "Orders" WHERE OrderID = 100이 작동합니다. 하지만 이는 DynamoDB API를 통한 SQL 호환 표면입니다. SQL 엔진이 아님 - AWS는 _subset_만 지원하므로 JOIN, GROUP BYCOUNT(*)가 나왔습니다. 이를 위해서는 맨 위에 엔진이 계층화되어 있어야 합니다.

AWS는 PartiQL을 "Amazon DynamoDB의 데이터를 선택·삽입·업데이트·삭제하기 위한 SQL 호환 쿼리 언어"라고 설명하지만, "Amazon DynamoDB는 PartiQL 쿼리 언어의 _일부_만 지원한다"고도 똑같이 분명히 밝히고 있습니다. JOIN, GROUP BY 또는 COUNT(*)에 손을 뻗는 순간, 당신은 PartiQL이 할 수 있는 범위를 벗어났습니다. — 참조 전체 기능별 보기는 PartiQL vs SQL 비교.

PartiQL: SQL 엔진이 아닌 SQL 호환 표면

PartiQL은 SQL로 보이는 명령문을 SDK의 동일한 데이터 평면 작업에 매핑합니다. 노출합니다. 등식을 갖는 SELECTQuery로 컴파일됩니다. 에 하나가 없는 SELECTScan로 컴파일됩니다. AWS SELECT 참조 문서에 따르면:

SELECT 문을 사용하면 같거나 같은 경우 전체 테이블 스캔이 발생할 수 있습니다. WHERE 절에는 파티션 키가 포함된 IN 조건이 제공되지 않습니다.

따라서 QueryScan에 적용되는 동일한 액세스 패턴 규칙이 여전히 적용됩니다. PartiQL은 익숙한 구문 뒤에 이를 숨깁니다. 쿼리 플래너를 추가하지 않습니다. 조인 및 집합 기반 집계가 없습니다. 모든 문은 하나의 기본으로 축소됩니다. 작업:

파티션 키 동일성이 없는 SELECT는 전체 테이블 Scan로 컴파일됩니다. us-east-1 온디맨드에서는 검사된 모든 항목에 대해 최종 일관성 기준 4KB당 0.5RCU가 청구됩니다 — 2KB 행으로 구성된 500MB 테이블은 WHERE 필터로 결과 집합을 좁히기 전 기준으로 대략 125,000 RCU입니다. 라인 레이트의 PartiQL 형태 읽기는 pricing calculator에서 확인하세요.

당신은 쓴다DynamoDB 실행
SELECT … WHERE PK = …GetItem 또는 Query
SELECT … (PK 없음)Scan (전체 테이블 읽기)
INSERT INTO …PutItem
UPDATE … WHERE PK=… AND SK=…UpdateItem (1개 항목)
DELETE … WHERE PK=… AND SK=…DeleteItem (1개 항목)

작업이 단일 Get/Query/Scan/Put/Update/Delete로 줄어들지 않는 경우, PartiQL은 이를 단순히 표현할 수 없습니다. 아래의 모든 것은 그 결과입니다. 사실.

PartiQL에서 다루는 내용

DynamoDB의 PartiQL은 4개의 DML/쿼리 문을 지원합니다.

  • SELECT — 항목 읽기(Query 또는 Scan로 컴파일)
  • INSERT — 항목 추가(PutItem)
  • 업데이트 — 항목 수정(UpdateItem)
  • 삭제 — 항목 제거(DeleteItem)

또한 지원합니다 transactions and batch operations. 잘 구성된 읽기 대상 동등 또는 IN가 있는 파티션 키:

SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESC

ORDER BY은 허용되지만 AWS 참조에서는 주문 키를 "a"로 제한합니다. 해시 키 또는 정렬 키" — 임의의 열이 아닌 파티션 또는 입니다. 이것이 PartiQL의 SELECT이 허용하는 최대치입니다. 복사-붙여넣기 가능 진술은 PartiQL examples를 참조하세요.

PartiQL이 할 수 없는 일

개발자가 "SQL" 및 PartiQL에서 가장 자주 기대하는 사항은 다음과 같습니다. 아무것도 지원하지 않습니다.

  • 아니요 JOIN. PartiQL SELECT 구문은 단일 FROM {{table}}[.{{index}}] — 하나의 테이블 또는 하나의 인덱스, 절대 두 개가 아님 키와 관련된 테이블. 이것은 single-table-design 절충안: 당신의 모델은 다음과 같습니다. 쿼리 계층은 데이터를 재구성할 수 없기 때문에 액세스 패턴을 미리 파악해야 합니다. 나중에.
  • 아니요 GROUP BY. 문법에 없습니다. 행을 그룹화하는 절이 없습니다.
  • 집계 함수가 없습니다. PartiQL functions reference "집계 함수" 아래에 정확히 하나의 함수가 나열됩니다: SIZE, 이는 다음을 반환합니다. 단일 항목에 대한 속성의 크기(바이트)입니다. COUNT은 없습니다. 행 전체에 걸쳐 SUM, AVG, MIN 또는 MAX. AWS는 다음과 같이 분명히 말합니다. "모든 SQL 이 목록에 포함되지 않은 기능은 현재 지원되지 않습니다. DynamoDB."
  • LIKE 없음, 하위 쿼리 없음, UNION 없음, 창 기능 없음. 패턴 일치 contains / begins_with를 사용합니다. 나머지는 전혀 동등하지 않습니다.

따라서 "지난 달 고객별 총 수익" — 어느 곳에서나 한 줄 GROUP BY 관계형 데이터베이스 — PartiQL에서는 표현할 수 없습니다. 당신은 데이터를 스캔하고 애플리케이션 코드에서 집계합니다.

DynamoDB를 통해 실제 JOIN / GROUP BY / 집계 동작을 얻을 수 있는 유일한 방법 데이터는 그 위에 실제 SQL 엔진을 실행하는 도구입니다. 대화형의 경우, 임시 쿼리에는 두 가지가 있습니다. Amazon Athena의 연합 커넥터와 DynoTable의 SQL Workbench. (예약 분석의 경우 DynamoDB의 zero-ETL Amazon Redshift에 통합하면 SQL 조인 및 집계도 실행됩니다.)

Amazon Athena를 통해 실제 SQL로 DynamoDB를 쿼리하는 방법

"DynamoDB를 통한 실제 SQL"에 대한 AWS의 답변은 다음과 같습니다. Amazon Athena DynamoDB connector, "Athena가 DynamoDB와 통신하여 쿼리할 수 있도록 해줍니다. SQL을 사용하는 테이블." Athena는 완전한 SQL 엔진이므로 이것이 _효과적_입니다. JOIN과 집계를 실제로 얻을 수 있습니다 — AWS의 워크스루 제목이 "Athena를 사용해 Amazon DynamoDB 테이블에 액세스·쿼리·조인하기"입니다.

캐치는 설정 및 비용입니다.

  • 계정에 배포하는 Lambda 기반 페더레이션 커넥터입니다. (Athena 콘솔 또는 Serverless Application Repository를 통해), 유선 스키마를 위해 AWS Glue를 통해 결과를 S3 버킷으로 유출 (connector docs).
  • 내부적으로는 여전히 DynamoDB의 QueryScan API 작업을 사용합니다. AWS는 "스캔을 사용하는 쿼리는 많은 수의 읽기를 소비할 수 있다"고 경고합니다. 용량 단위(RCU)"이므로 큰 테이블에 대한 분석 쿼리는 다음을 읽습니다. 미터 - 많은 항목 (connector costs). 사용 item-size calculator이 얼마나 되는지 측정해 보세요. 스캔이 많은 쿼리에는 비용이 듭니다.
  • INSERT INTO와 같은 쓰기 작업은 커넥터를 통해 지원되지 않습니다.

Athena는 예약된 분석 및 BI 대시보드에 적합한 도구입니다. 무겁다 일상적인 "테이블 두 개를 조인하고 결과를 살펴보기만 하면 됩니다" — 이것이 다음 섹션에서 채워지는 공백입니다.

DynoTable SQL Workbench: DynamoDB 액세스 패턴 규칙 내의 SQL

DynoTable의 SQL Workbench는 실제 SQL — JOIN, GROUP BY, COUNT/SUM/AVG — 데스크톱 클라이언트의 라이브 DynamoDB 테이블에 대해, Lambda, Glue 또는 S3가 필요하지 않습니다. 다음을 통해 행을 구체화합니다. DynamoDB의 실제 Query/Scan 런타임, 그 위에 단일 SELECT 실행 데스크탑에서 로컬로:

-- Runs in the DynoTable Workbench (NOT in PartiQL):
SELECT c.country, COUNT(*) AS orders, SUM(o.total) AS revenue
FROM orders o
INNER JOIN customers c ON o.customerId = c.PK
GROUP BY c.country
ORDER BY revenue DESC

"DynamoDB의 액세스 패턴 규칙 내" 부분이 중요합니다. 워크벤치는 그렇지 않습니다. DynamoDB가 Postgres라고 가정합니다. — 여전히 아래에서 Query/Scan까지 읽습니다. 후드를 통해 각 쿼리 비용을 파악하고 DynamoDB의 모델을 숨기는 대신 액세스 모델을 사용하세요.

  • INNER JOINLEFT JOIN만 — ON 대상 속성은 파티션 키 또는 GSI 파티션 키. RIGHT / FULL / CROSS / 쉼표 결합이 아닙니다.
  • 아직 자체 조인, 하위 쿼리, 파생 테이블, 창 기능이 없습니다.
  • 조인 및 프로젝션은 스칼라 속성에서 작동합니다.

원시 API에 대한 조건과 키 표현식만 작성하면 되는 경우 — 전체 SQL 문이 아님 — DynamoDB Expression Builder는 다음을 생성합니다. PartiQL 표면 없이 올바른 FilterExpression / KeyConditionExpression 전혀.

탐색, 디버깅, 분석을 위한 DynamoDB SQL 클라이언트가 목표인 경우 Workbench가 그 공백을 메우고 DynoTable의 나머지 부분은 전체 테이블입니다. 그 주변에는 DynamoDB GUI가 있습니다.

Try DynoTable 자신의 테이블에 대해 실제 SQL을 실행합니다.

FAQ

DynamoDB에서 SQL을 실행할 수 있습니까? SQL 호환 하위 집합(SELECT/INSERT/UPDATE/DELETE)인 PartiQL을 실행할 수 있습니다. 키). JOIN, GROUP BY 및 집계의 경우 맨 위에 SQL 엔진이 필요합니다. Athena DynamoDB 커넥터 또는 DynoTable의 SQL Workbench — 단일 SELECT 언어 INNER/LEFT JOIN을 사용하고 CTE, 공용체 또는 하위 쿼리가 없습니다.

DynamoDB PartiQL은 JOIN을 지원합니까? 아니요. PartiQL SELECT 구문에는 단일 FROM 테이블 또는 인덱스가 있고 조인은 없습니다. 문법. 조인에는 DynamoDB 위에 계층화된 엔진이 필요합니다.

PartiQL은 GROUP BY 또는 COUNT 및 SUM과 같은 집계를 지원합니까? 아니요. GROUP BY 절은 없으며 유일한 "집계" 함수는 SIZE입니다. (한 항목에 대한 속성의 바이트 크기) COUNT, SUM, AVG, MINMAX 여러 행은 지원되지 않습니다.

DynamoDB는 SQL입니까, NoSQL입니까? NoSQL — 키-값 및 문서 저장소입니다. PartiQL은 SQL 호환 쿼리를 추가합니다. 언어가 맨 위에 있지만 DynamoDB에는 관계형 엔진, 조인 또는 집계가 없습니다.

PartiQL은 임시 쿼리에 적합합니까? 키 기반 조회의 경우 그렇습니다. 분석 임시 쿼리(개수, 롤업, 조인), 아니요 — PartiQL은 이를 표현할 수 없으며 제한되지 않은 19는 자동으로 전체 테이블 스캔이 됩니다.

JOIN 및 GROUP BY를 처리하는 DynamoDB SQL 클라이언트가 있습니까? 예 — DynoTable의 SQL Workbench는 라이브에 대해 JOIN/GROUP BY/집계를 실행합니다. Amazon Athena는 페더레이션된 커넥터를 통해 이를 수행합니다. AWS 계정에 배포하세요.

업데이트됨