SQL per DynamoDB: cosa funziona, cosa no e il Workbench
DynamoDB è un archivio chiave-valore NoSQL, ma risponde a domande in forma SQL più
di quanto la gente si aspetti — e molto meno di quanto speri. Questa è la mappa
onesta: quanto SQL-su-DynamoDB ottieni davvero out of the box, dove si ferma, e i
pochi modi per eseguire le query JOIN / GROUP BY / aggregate che la superficie
nativa non può esprimere.
Puoi interrogare DynamoDB con SQL? La risposta breve
In parte. DynamoDB include PartiQL, che la
documentazione AWS
descrive come "un linguaggio di query SQL-compatibile, per selezionare, inserire,
aggiornare ed eliminare dati in Amazon DynamoDB". Quindi puoi scrivere SELECT * FROM "Orders" WHERE OrderID = 100 e funziona.
Ma PartiQL è una superficie SQL-compatibile sopra l'API DynamoDB, non un motore
SQL. Parla la sintassi; non aggiunge potenza di query relazionale. AWS è
esplicita sul fatto che "Amazon DynamoDB supporta un sottoinsieme del linguaggio
di query PartiQL"
(riferimento).
Nel momento in cui ricorri a un JOIN, a un GROUP BY o a COUNT(*), sei fuori da
ciò che PartiQL può fare — vedi PartiQL vs SQL per il
confronto completo funzionalità per funzionalità.
PartiQL: una superficie SQL-compatibile, non un motore SQL
PartiQL mappa istruzioni dall'aspetto SQL sulle stesse operazioni del piano dati che
l'SDK espone. Una SELECT con un'uguaglianza sulla chiave di partizione compila in
una Query; una SELECT senza compila in uno Scan. Secondo il
riferimento AWS di SELECT:
L'uso dell'istruzione
SELECTpuò risultare in una scansione completa della tabella se nella clausola WHERE non viene fornita una condizione di uguaglianza o IN con una chiave di partizione.
Quindi le stesse regole di pattern di accesso che governano Query e Scan si
applicano ancora — PartiQL le nasconde solo dietro una sintassi familiare. Non
aggiunge query planner, join né aggregazione basata su insiemi. Ogni istruzione
collassa in una operazione nativa:
| Tu scrivi | DynamoDB esegue |
|---|---|
SELECT … WHERE PK = … | GetItem o Query |
SELECT … (senza PK) | Scan (legge l'intera tabella) |
INSERT INTO … | PutItem |
UPDATE … WHERE PK=… AND SK=… | UpdateItem (un elemento) |
DELETE … WHERE PK=… AND SK=… | DeleteItem (un elemento) |
Se un'operazione non si riduce a un singolo Get/Query/Scan/Put/Update/Delete, PartiQL semplicemente non può esprimerla. Tutto ciò che segue è una conseguenza di quell'unico fatto.
Cosa copre PartiQL
PartiQL di DynamoDB supporta quattro istruzioni DML/query:
- SELECT — leggere elementi (compila in
QueryoScan) - INSERT — aggiungere un elemento (
PutItem) - UPDATE — modificare un elemento (
UpdateItem) - DELETE — rimuovere un elemento (
DeleteItem)
Supporta anche
transazioni e operazioni batch.
Una lettura ben formata punta alla chiave di partizione con un'uguaglianza o un IN:
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESCORDER BY è consentito, ma il riferimento AWS limita la chiave di ordinamento a "una
hash key o una sort key" — la chiave di partizione o di ordinamento, non colonne
arbitrarie. Quello è il tetto di ciò che la SELECT di PartiQL accetta. Per
istruzioni pronte da copia-incolla, vedi gli esempi PartiQL.
Cosa PartiQL non può fare
Queste sono le cose che gli sviluppatori più spesso si aspettano da "SQL", e PartiQL non ne supporta nessuna:
- Niente
JOIN. La sintassiSELECTdi PartiQL è un singoloFROM {{table}}[.{{index}}]— una tabella o un indice, mai due tabelle correlate su una chiave. Questo è il compromesso del single-table-design: modelli per i tuoi pattern di accesso in anticipo perché il livello di query non può rimodellare i dati a posteriori. - Niente
GROUP BY. Non è nella grammatica; non c'è una clausola per raggruppare le righe. - Nessuna funzione di aggregazione. Il
riferimento delle funzioni PartiQL
elenca esattamente una funzione sotto "Funzioni di aggregazione":
SIZE, che restituisce la dimensione in byte di un attributo per un singolo elemento. Non c'èCOUNT,SUM,AVG,MINoMAXtra le righe. AWS afferma chiaramente: "Qualsiasi funzione SQL non inclusa in questo elenco non è attualmente supportata in DynamoDB". - Niente
LIKE, niente subquery, nienteUNION, niente funzioni window. Il pattern matching usacontains/begins_with; il resto non ha alcun equivalente.
Quindi "ricavi totali per cliente il mese scorso" — un GROUP BY di una riga in
qualsiasi database relazionale — non può essere espresso in PartiQL. Dovresti
estrarre i dati con uno scan e aggregarli nel codice dell'applicazione.
L'unico modo per ottenere vero comportamento JOIN / GROUP BY / aggregato sui dati
DynamoDB è uno strumento che esegue un vero motore SQL sopra. Ce ne sono due: il
connettore federato di Amazon Athena, e il Workbench SQL di DynoTable.
Come interrogare DynamoDB con vero SQL via Amazon Athena
La risposta di AWS a "vero SQL su DynamoDB" è il
connettore DynamoDB di Amazon Athena,
che "abilita Amazon Athena a comunicare con DynamoDB così da poter interrogare le tue
tabelle con SQL". Poiché Athena è un motore SQL completo, questo ti dà JOIN e
aggregati — la guida pratica di AWS è intitolata
"Accedi, interroga e unisci tabelle Amazon DynamoDB usando Athena".
L'inghippo è la configurazione e il costo:
- È un connettore federato basato su Lambda che distribuisci nel tuo account (tramite la console Athena o il Serverless Application Repository), collegato attraverso AWS Glue per lo schema e che riversa i risultati in un bucket S3 (documentazione del connettore).
- Sotto il cofano usa comunque le operazioni API
QueryeScandi DynamoDB. AWS avverte che "le query che usano scansioni possono consumare un gran numero di unità di capacità di lettura (RCU)", quindi una query analitica su una tabella grande legge — e misura — molti elementi (costi del connettore). Usa il calcolatore della dimensione degli elementi per valutare quanto costerà una query con molte scansioni. - Operazioni di scrittura come
INSERT INTOnon sono supportate tramite il connettore.
Athena è lo strumento giusto per analitica programmata e dashboard BI. È pesante per il caso quotidiano "devo solo unire due tabelle e dare un'occhiata al risultato" — che è la lacuna che colma la sezione successiva.
Workbench SQL di DynoTable: SQL all'interno delle regole di pattern di accesso di DynamoDB
Il Workbench SQL di DynoTable esegue vero SQL — JOIN, GROUP BY,
COUNT/SUM/AVG — contro le tue tabelle DynamoDB live da un client desktop,
senza alcuna Lambda, Glue o S3 da allestire. Materializza le righe attraverso il vero
runtime Query/Scan di DynamoDB, poi esegue il tuo SQL completo in un motore in
memoria sopra:
-- Gira nel Workbench DynoTable (NON 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 DESCLa parte "all'interno delle regole di pattern di accesso di DynamoDB" è importante.
Il Workbench non finge che DynamoDB sia Postgres — legge comunque tramite
Query/Scan sotto il cofano, così resti consapevole di quanto costa ogni query, e
applica il modello di accesso di DynamoDB invece di nasconderlo:
- Solo
INNER JOINeLEFT JOIN— l'attributo target diONdeve essere una chiave di partizione o una chiave di partizione GSI. NienteRIGHT/FULL/CROSS/ comma-join. - Ancora nessun self-join, nessuna subquery, nessuna tabella derivata, nessuna funzione window.
- Join e proiezioni operano su attributi scalari.
Se ti serve solo comporre le condizioni e le espressioni di chiave per l'API grezza —
non un'istruzione SQL completa — il
DynamoDB Expression Builder genera il corretto
FilterExpression / KeyConditionExpression senza la superficie PartiQL del tutto.
Se il tuo obiettivo è un client SQL DynamoDB per esplorare, fare debug e analizzare le tabelle, il Workbench colma quella lacuna — e il resto di DynoTable è una GUI DynamoDB completa attorno a esso.
Prova DynoTable per eseguire vero SQL contro le tue tabelle.
FAQ
Puoi eseguire SQL su DynamoDB? Puoi eseguire PartiQL, un sottoinsieme SQL-compatibile (SELECT/INSERT/UPDATE/DELETE per chiave). Per SQL completo — JOIN, GROUP BY, aggregati — ti serve un motore SQL sopra: il connettore DynamoDB di Amazon Athena, o il Workbench SQL di DynoTable.
DynamoDB PartiQL supporta JOIN?
No. La sintassi SELECT di PartiQL ha una singola tabella o indice in FROM e
nessuna grammatica di join. I join richiedono un motore stratificato sopra DynamoDB.
PartiQL supporta GROUP BY o aggregati come COUNT e SUM?
No. Non c'è una clausola GROUP BY, e l'unica funzione "di aggregazione" è SIZE
(la dimensione in byte di un attributo per un elemento). COUNT, SUM, AVG,
MIN e MAX tra le righe non sono supportati.
DynamoDB è SQL o NoSQL? NoSQL — un archivio chiave-valore e di documenti. PartiQL aggiunge un linguaggio di query SQL-compatibile sopra, ma DynamoDB non ha motore relazionale, join o aggregati.
PartiQL è buono per query ad hoc?
Per lookup basate su chiave, sì. Per query analitiche ad hoc (conteggi, rollup,
join), no — PartiQL non può esprimerle, e le SELECT non vincolate diventano
silenziosamente scansioni complete della tabella.
Esiste un client SQL DynamoDB che gestisce JOIN e GROUP BY?
Sì — il Workbench SQL di DynoTable esegue JOIN/GROUP BY/aggregati contro tabelle
live dal desktop, e Amazon Athena lo fa tramite un connettore federato che distribuisci
nel tuo account AWS.