SQL für DynamoDB und die Grenzen von PartiQL
DynamoDB ist ein NoSQL-Key-Value-Store, beantwortet SQL-förmige Fragen aber häufiger,
als man erwartet — und weit seltener, als man hofft. Hier die ehrliche Landkarte: welches
SQL-auf-DynamoDB du ab Werk wirklich bekommst, wo es aufhört, und die wenigen Wege,
die JOIN-/GROUP BY-/Aggregat-Abfragen zu fahren, die die native Oberfläche nicht
ausdrücken kann.
Kann man DynamoDB mit SQL abfragen?
Teilweise. DynamoDB bringt mit, eine SQL-kompatible Sprache für
SELECT/INSERT/UPDATE/DELETE über den Key — SELECT * FROM "Orders" WHERE OrderID = 100 funktioniert also. Aber es ist eine SQL-kompatible Oberfläche über dem DynamoDB-API,
keine SQL-Engine — AWS unterstützt nur eine Teilmenge, JOIN, GROUP BY und
COUNT(*) fallen also weg. Dafür brauchst du eine Engine darüber.
AWS beschreibt PartiQL als
"a SQL-compatible query language, to select, insert, update, and delete data in Amazon DynamoDB",
sagt aber genauso deutlich: "Amazon DynamoDB supports a subset of the PartiQL
query language." In dem Moment, in dem du zu einem JOIN, einem GROUP BY oder COUNT(*) greifst,
bist du außerhalb dessen, was PartiQL kann — den vollständigen Vergleich Feature für Feature
findest du in PartiQL vs. SQL.
PartiQL: eine SQL-kompatible Oberfläche, keine SQL-Engine
PartiQL bildet SQL-artige Statements auf dieselben Data-Plane-Operationen ab, die auch das SDK
freilegt. Ein SELECT mit einer Gleichheit auf den kompiliert zu einer Query; ein
SELECT ohne kompiliert zu einem Scan. Laut der
AWS-SELECT-Referenz:
Using the
SELECTstatement can result in a full table scan if an equality or IN condition with a partition key is not provided in the WHERE clause.
Es gelten also weiterhin dieselben Zugriffsmuster-Regeln wie für Query und Scan —
PartiQL versteckt sie nur hinter vertrauter Syntax. Es ergänzt keinen Query-Planner, keine
Joins und keine mengenbasierte Aggregation. Jedes Statement fällt auf eine native
Operation zusammen:
Ein SELECT ohne Gleichheit auf den Partition Key kompiliert zu einem Full-Table-Scan. In
us-east-1 On-Demand kostet das 0,5 RCU pro 4 KB letztendlich konsistent für
jedes geprüfte Item — eine 500 MB große Tabelle aus 2 KB großen Zeilen sind grob 125.000
RCU, noch bevor ein WHERE-Filter das Result Set eingrenzt. Rechne PartiQL-förmige
Lesevorgänge im Preisrechner durch.
| Du schreibst | DynamoDB führt aus |
|---|---|
SELECT … WHERE PK = … | GetItem oder Query |
SELECT … (ohne PK) | Scan (liest die ganze Tabelle) |
INSERT INTO … | PutItem |
UPDATE … WHERE PK=… AND SK=… | UpdateItem (ein Item) |
DELETE … WHERE PK=… AND SK=… | DeleteItem (ein Item) |
Lässt sich eine Operation nicht auf ein einzelnes Get/Query/Scan/Put/Update/Delete reduzieren, kann PartiQL sie schlicht nicht ausdrücken. Alles Weitere unten ist eine Folge dieser einen Tatsache.
Was PartiQL abdeckt
Das PartiQL von DynamoDB unterstützt vier DML-/Abfrage-Statements:
- SELECT — Items lesen (kompiliert zu
QueryoderScan) - INSERT — ein Item hinzufügen (
PutItem) - UPDATE — ein Item ändern (
UpdateItem) - DELETE — ein Item entfernen (
DeleteItem)
Es unterstützt außerdem
Transaktionen und Batch-Operationen.
Ein wohlgeformter Lesevorgang trifft
den Partition Key mit einer Gleichheit oder einem IN:
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESCORDER BY ist erlaubt, aber die AWS-Referenz beschränkt den Ordnungs-Key auf "a
hash key or a sort key" — den Partition Key oder , nicht beliebige Spalten.
Das ist die Decke dessen, was SELECT in PartiQL akzeptiert. Statements zum Kopieren und Einfügen
findest du in den PartiQL-Beispielen.
Was PartiQL nicht kann
Das sind die Dinge, die Entwickler am häufigsten von „SQL“ erwarten, und PartiQL unterstützt keines davon:
- Kein
JOIN. Die PartiQL-SELECT-Syntax ist ein einzelnesFROM {{table}}[.{{index}}]— eine Tabelle oder ein Index, nie zwei über einen Key verbundene Tabellen. Das ist der Tradeoff von Single-Table-Design: Du modellierst vorab für deine Zugriffsmuster, weil die Query-Schicht die Daten hinterher nicht umformen kann. - Kein
GROUP BY. Es steht nicht in der Grammatik; es gibt keine Klausel, um Zeilen zu gruppieren. - Keine Aggregatfunktionen. Die
PartiQL-Funktionsreferenz
führt unter "Aggregate functions" genau eine Funktion auf:
SIZE, die die Größe eines Attributs in Bytes für ein einzelnes Item zurückgibt. Es gibt keinCOUNT,SUM,AVG,MINund keinMAXüber Zeilen hinweg. AWS sagt es klar: "Any SQL functions that are not included in this list are not currently supported in DynamoDB." - Kein
LIKE, keine Subqueries, keinUNION, keine Fensterfunktionen. Mustervergleiche laufen übercontains/begins_with; für den Rest gibt es überhaupt keine Entsprechung.
„Gesamtumsatz je Kunde im letzten Monat“ — ein einzeiliges GROUP BY in jeder
relationalen Datenbank — lässt sich in PartiQL also nicht ausdrücken. Du würdest die Daten herausscannen und
im Anwendungscode aggregieren.
Echtes JOIN-/GROUP BY-/Aggregat-Verhalten über DynamoDB-Daten bekommst du nur mit
einem Werkzeug, das eine echte SQL-Engine darüber betreibt. Für interaktive
Ad-hoc-Abfragen gibt es zwei: den Federated Connector von Amazon Athena und
den SQL Workbench von DynoTable. (Für geplante Analytik führt auch die Zero-ETL-Integration
von DynamoDB nach Amazon Redshift SQL-Joins und -Aggregate aus.)
Wie du DynamoDB mit echtem SQL über Amazon Athena abfragst
Die eigene Antwort von AWS auf „echtes SQL über DynamoDB“ ist der
Amazon-Athena-DynamoDB-Connector,
der "enables Amazon Athena to communicate with DynamoDB so that you can query your tables with SQL."
Weil Athena eine vollwertige SQL-Engine ist, bekommst du damit tatsächlich
JOIN und Aggregate — die Anleitung von AWS heißt
"Access, query, and join Amazon DynamoDB tables using Athena."
Der Haken sind Einrichtung und Kosten:
- Es ist ein Lambda-basierter Federated Connector, den du in deinem Konto ausrollst (über die Athena-Konsole oder das Serverless Application Repository), über AWS Glue für das Schema verdrahtet und mit Ergebnisüberlauf in einen S3-Bucket (Connector-Doku).
- Unter der Haube nutzt er weiterhin die API-Operationen
QueryundScanvon DynamoDB. AWS warnt: "queries that use scans can consume a large number of read capacity units (RCUs)," eine analytische Abfrage über eine große Tabelle liest — und misst — also viele Items (Connector-Kosten). Nutze den Item-Size-Rechner, um abzuschätzen, was eine scan-lastige Abfrage kostet. - Schreiboperationen wie
INSERT INTOwerden über den Connector nicht unterstützt.
Athena ist das richtige Werkzeug für geplante Analytik und BI-Dashboards. Für den Alltagsfall „ich will nur zwei Tabellen joinen und das Ergebnis ansehen“ ist es schwerfällig — und genau diese Lücke füllt der nächste Abschnitt.
DynoTable SQL Workbench: SQL innerhalb der Zugriffsmuster-Regeln von DynamoDB
Der SQL Workbench von DynoTable führt echtes SQL aus — JOIN, GROUP BY,
COUNT/SUM/AVG — gegen deine laufenden DynamoDB-Tabellen aus einem Desktop-Client,
ohne dass du Lambda, Glue oder S3 aufsetzen musst. Er materialisiert die Zeilen über die echte
Query/Scan-Runtime von DynamoDB und führt darüber lokal auf deinem Desktop
ein einzelnes SELECT aus:
-- 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 DESCDer Teil „innerhalb der Zugriffsmuster-Regeln von DynamoDB“ ist wichtig. Der Workbench tut nicht
so, als wäre DynamoDB Postgres — er liest unter der Haube weiterhin über Query/Scan,
du behältst also im Blick, was jede Abfrage kostet, und er setzt das Zugriffsmodell von DynamoDB
durch, statt es zu verstecken:
- Nur
INNER JOINundLEFT JOIN— das Zielattribut imONmuss ein Partition Key oder GSI-Partition-Key sein. KeinRIGHT/FULL/CROSS/ Komma-Join. - Noch keine Self-Joins, keine Subqueries, keine abgeleiteten Tabellen, keine Fensterfunktionen.
- Joins und Projektionen arbeiten auf skalaren Attributen.
Wenn du nur die Bedingungen und Key-Ausdrücke für das rohe API zusammensetzen willst —
kein vollständiges SQL-Statement —, erzeugt der
DynamoDB Expression Builder die
korrekte FilterExpression / KeyConditionExpression ganz ohne die PartiQL-Oberfläche.
Ist dein Ziel ein SQL-Client für DynamoDB, um Tabellen zu erkunden, zu debuggen und zu analysieren, füllt der Workbench diese Lücke — und der Rest von DynoTable ist eine vollständige DynamoDB-GUI drum herum.
Probier DynoTable aus, um echtes SQL gegen deine eigenen Tabellen laufen zu lassen.
FAQ
Kann man SQL auf DynamoDB ausführen? Du kannst PartiQL ausführen, eine SQL-kompatible Teilmenge (SELECT/INSERT/UPDATE/DELETE über den Key). Für JOIN, GROUP BY und Aggregate brauchst du eine SQL-Engine darüber: den Amazon-Athena-DynamoDB-Connector oder den SQL Workbench von DynoTable — ein einzelner SELECT-Dialekt mit INNER/LEFT JOIN, ohne CTEs, Unions oder Subqueries.
Unterstützt DynamoDB PartiQL JOIN?
Nein. Die PartiQL-SELECT-Syntax hat eine einzelne FROM-Tabelle oder einen Index und keine
Join-Grammatik. Joins brauchen eine Engine über DynamoDB.
Unterstützt PartiQL GROUP BY oder Aggregate wie COUNT und SUM?
Nein. Es gibt keine GROUP BY-Klausel, und die einzige „Aggregat“-Funktion ist SIZE
(die Byte-Größe eines Attributs für ein Item). COUNT, SUM, AVG, MIN und MAX
über Zeilen hinweg werden nicht unterstützt.
Ist DynamoDB SQL oder NoSQL? NoSQL — ein Key-Value- und Dokumenten-Store. PartiQL legt eine SQL-kompatible Abfragesprache darüber, aber DynamoDB hat keine relationale Engine, keine Joins und keine Aggregate.
Eignet sich PartiQL für Ad-hoc-Abfragen?
Für Key-basierte Lookups ja. Für analytische Ad-hoc-Abfragen (Zählungen, Aggregationen,
Joins) nein — PartiQL kann sie nicht ausdrücken, und unbeschränkte SELECTs werden still
zu Full-Table-Scans.
Gibt es einen DynamoDB-SQL-Client, der JOIN und GROUP BY beherrscht?
Ja — der SQL Workbench von DynoTable führt JOIN/GROUP BY/Aggregate gegen laufende
Tabellen vom Desktop aus, und Amazon Athena schafft das über einen Federated Connector, den du
in deinem AWS-Konto ausrollst.