SQL untuk DynamoDB: Apa yang Bekerja, Apa yang Tidak, dan Workbench
DynamoDB adalah penyimpanan key-value NoSQL, tapi ia menjawab pertanyaan berbentuk-SQL
lebih dari yang orang kira — dan jauh lebih sedikit dari yang mereka harapkan. Inilah
peta yang jujur: SQL-di-DynamoDB apa yang benar-benar kamu dapat di luar kotak, di mana
ia berhenti, dan beberapa cara untuk menjalankan kueri JOIN / GROUP BY / agregat yang
tak bisa diekspresikan permukaan native.
Bisakah kamu mengkueri DynamoDB dengan SQL? Jawaban singkat
Sebagian. DynamoDB membawa PartiQL, yang
dokumen AWS
gambarkan sebagai "a SQL-compatible query language, to select, insert, update, and
delete data in Amazon DynamoDB." Jadi kamu bisa menulis SELECT * FROM "Orders" WHERE OrderID = 100 dan itu bekerja.
Tapi PartiQL adalah permukaan kompatibel-SQL di atas API DynamoDB, bukan mesin SQL.
Ia berbicara sintaksnya; ia tidak menambah daya kueri relasional. AWS eksplisit
bahwa "Amazon DynamoDB supports a subset of the PartiQL query language"
(referensi).
Saat kamu menjangkau JOIN, GROUP BY, atau COUNT(*), kamu di luar
apa yang bisa dilakukan PartiQL — lihat PartiQL vs SQL untuk
perbandingan fitur demi fitur lengkapnya.
PartiQL: permukaan kompatibel-SQL, bukan mesin SQL
PartiQL memetakan pernyataan yang terlihat SQL ke operasi data-plane yang sama yang
dipaparkan SDK. Sebuah SELECT dengan kesetaraan partition-key dikompilasi ke Query;
sebuah SELECT tanpanya dikompilasi ke Scan. Per
referensi SELECT AWS:
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.
Jadi aturan pola-akses yang sama yang mengatur Query dan Scan tetap berlaku —
PartiQL hanya menyembunyikannya di balik sintaks familiar. Ia tak menambah query
planner, tanpa join, dan tanpa agregasi berbasis-set. Setiap pernyataan runtuh ke satu
operasi native:
| Kamu menulis | DynamoDB menjalankan |
|---|---|
SELECT … WHERE PK = … | GetItem atau Query |
SELECT … (tanpa PK) | Scan (membaca seluruh tabel) |
INSERT INTO … | PutItem |
UPDATE … WHERE PK=… AND SK=… | UpdateItem (satu item) |
DELETE … WHERE PK=… AND SK=… | DeleteItem (satu item) |
Jika sebuah operasi tak menyusut ke satu Get/Query/Scan/Put/Update/Delete, PartiQL sederhananya tak bisa mengekspresikannya. Semua di bawah ini adalah konsekuensi dari satu fakta itu.
Apa yang dicakup PartiQL
PartiQL DynamoDB mendukung empat pernyataan DML/kueri:
- SELECT — baca item (dikompilasi ke
QueryatauScan) - INSERT — tambah item (
PutItem) - UPDATE — modifikasi item (
UpdateItem) - DELETE — hapus item (
DeleteItem)
Ia juga mendukung
transaksi dan operasi batch.
Sebuah baca yang well-formed menarget
partition key dengan kesetaraan atau IN:
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESCORDER BY diizinkan, tapi referensi AWS membatasi kunci pengurutan ke "a
hash key or a sort key" — partition atau sort key, bukan kolom sembarang.
Itulah plafon dari apa yang diterima SELECT PartiQL. Untuk pernyataan siap-tempel,
lihat contoh PartiQL.
Apa yang tak bisa dilakukan PartiQL
Inilah hal-hal yang paling sering pengembang harapkan dari "SQL," dan PartiQL mendukung tak satu pun darinya:
- Tanpa
JOIN. SintaksSELECTPartiQL adalahFROM {{table}}[.{{index}}]tunggal — satu tabel atau satu index, tak pernah dua tabel berhubungan pada sebuah key. Ini tradeoff single-table-design: kamu memodelkan untuk pola aksesmu di depan karena lapisan kueri tak bisa membentuk ulang data setelahnya. - Tanpa
GROUP BY. Ia tak ada dalam grammar; tak ada klausa untuk mengelompokkan baris. - Tanpa fungsi agregat. Referensi fungsi
PartiQL
mencantumkan tepat satu fungsi di bawah "Aggregate functions":
SIZE, yang mengembalikan ukuran atribut dalam byte untuk satu item. Tak adaCOUNT,SUM,AVG,MIN, atauMAXlintas baris. AWS menyatakan terus terang: "Any SQL functions that are not included in this list are not currently supported in DynamoDB." - Tanpa
LIKE, tanpa subkueri, tanpaUNION, tanpa fungsi window. Pencocokan pola memakaicontains/begins_with; sisanya tak punya ekuivalen sama sekali.
Jadi "total pendapatan per pelanggan bulan lalu" — satu baris GROUP BY di basis data
relasional mana pun — tak bisa diekspresikan di PartiQL. Kamu harus scan datanya keluar
dan mengagregasinya di kode aplikasi.
Satu-satunya cara mendapat perilaku JOIN / GROUP BY / agregat sungguhan atas data
DynamoDB adalah alat yang menjalankan mesin SQL aktual di atasnya. Ada dua:
konektor federasi Amazon Athena, dan SQL Workbench DynoTable.
Cara mengkueri DynamoDB dengan SQL sungguhan via Amazon Athena
Jawaban AWS sendiri untuk "SQL sungguhan atas DynamoDB" adalah
konektor DynamoDB Amazon Athena,
yang "enables Amazon Athena to communicate with DynamoDB so that you can query
your tables with SQL." Karena Athena adalah mesin SQL penuh, ini memang memberimu
JOIN dan agregat — walkthrough AWS berjudul
"Access, query, and join Amazon DynamoDB tables using Athena."
Jebakannya adalah penyiapan dan biaya:
- Ini konektor federasi berbasis-Lambda yang kamu deploy ke akunmu (via konsol Athena atau Serverless Application Repository), terkabel melalui AWS Glue untuk skema dan menumpahkan hasil ke bucket S3 (dokumen konektor).
- Di balik layar ia tetap memakai operasi API
QuerydanScanDynamoDB. AWS memperingatkan bahwa "queries that use scans can consume a large number of read capacity units (RCUs)," jadi kueri analitik atas tabel besar membaca — dan menghitung — banyak item (biaya konektor). Gunakan kalkulator ukuran-item untuk mengukur berapa biaya kueri yang berat-scan. - Operasi tulis seperti
INSERT INTOtidak didukung melalui konektor.
Athena adalah alat yang tepat untuk analitik terjadwal dan dasbor BI. Ia berat untuk kasus sehari-hari "saya cuma perlu join dua tabel dan melihat hasilnya" — itulah celah yang diisi bagian berikutnya.
SQL Workbench DynoTable: SQL dalam aturan pola-akses DynamoDB
SQL Workbench DynoTable menjalankan SQL sungguhan — JOIN, GROUP BY,
COUNT/SUM/AVG — terhadap tabel DynamoDB live-mu dari klien desktop,
tanpa Lambda, Glue, atau S3 yang harus disiapkan. Ia memmaterialisasi baris melalui
runtime Query/Scan nyata DynamoDB, lalu menjalankan SQL penuhmu di mesin
in-memory di atasnya:
-- Berjalan di DynoTable Workbench (BUKAN di 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 DESCBagian "dalam aturan pola-akses DynamoDB" itu penting. Workbench tak
berpura-pura DynamoDB adalah Postgres — ia tetap membaca melalui Query/Scan di balik
layar, jadi kamu tetap sadar berapa biaya tiap kueri, dan ia menegakkan model
akses DynamoDB alih-alih menyembunyikannya:
- Hanya
INNER JOINdanLEFT JOIN— atribut-targetONharus partition key atau partition key GSI. TanpaRIGHT/FULL/CROSS/ comma-join. - Belum ada self-join, tanpa subkueri, tanpa tabel turunan, tanpa fungsi window.
- Join dan proyeksi beroperasi pada atribut skalar.
Jika kamu hanya butuh menyusun kondisi dan ekspresi key untuk API mentah —
bukan pernyataan SQL penuh — DynamoDB
Expression Builder menghasilkan
FilterExpression / KeyConditionExpression yang benar tanpa permukaan PartiQL
sama sekali.
Jika tujuanmu adalah klien SQL DynamoDB untuk menjelajah, men-debug, dan menganalisis tabel, Workbench mengisi celah itu — dan sisa DynoTable adalah GUI DynamoDB penuh di sekitarnya.
Coba DynoTable untuk menjalankan SQL sungguhan terhadap tabelmu sendiri.
FAQ
Bisakah kamu menjalankan SQL pada DynamoDB? Kamu bisa menjalankan PartiQL, subset kompatibel-SQL (SELECT/INSERT/UPDATE/DELETE berdasarkan key). Untuk SQL penuh — JOIN, GROUP BY, agregat — kamu butuh mesin SQL di atas: konektor DynamoDB Amazon Athena, atau SQL Workbench DynoTable.
Apakah PartiQL DynamoDB mendukung JOIN?
Tidak. Sintaks SELECT PartiQL punya satu tabel atau index FROM dan tanpa grammar
join. Join membutuhkan mesin yang dilapiskan di atas DynamoDB.
Apakah PartiQL mendukung GROUP BY atau agregat seperti COUNT dan SUM?
Tidak. Tak ada klausa GROUP BY, dan satu-satunya fungsi "agregat" adalah SIZE
(ukuran byte atribut untuk satu item). COUNT, SUM, AVG, MIN, dan MAX
lintas baris tidak didukung.
Apakah DynamoDB SQL atau NoSQL? NoSQL — penyimpanan key-value dan dokumen. PartiQL menambah bahasa kueri kompatibel-SQL di atas, tapi DynamoDB tak punya mesin relasional, join, atau agregat.
Apakah PartiQL bagus untuk kueri ad-hoc?
Untuk pencarian berbasis-key, ya. Untuk kueri ad-hoc analitik (count, rollup,
join), tidak — PartiQL tak bisa mengekspresikannya, dan SELECT tak-terbatas diam-diam
menjadi full table scan.
Adakah klien SQL DynamoDB yang menangani JOIN dan GROUP BY?
Ya — SQL Workbench DynoTable menjalankan JOIN/GROUP BY/agregat terhadap tabel
live dari desktop, dan Amazon Athena melakukannya via konektor federasi yang kamu
deploy di akun AWS-mu.