DynamoDB için SQL: Ne İşe Yarar, Ne Yaramaz ve Workbench
DynamoDB bir NoSQL anahtar-değer deposudur, ama SQL biçimli soruları insanların
beklediğinden daha çok — ve umduklarından çok daha az — yanıtlar. Bu, dürüst
haritadır: DynamoDB üzerindeki SQL'den kutudan çıkar çıkmaz gerçekten ne
aldığınız, nerede durduğu ve yerel yüzeyin ifade edemediği JOIN / GROUP BY /
toplama sorgularını çalıştırmanın birkaç yolu.
DynamoDB'yi SQL ile sorgulayabilir misiniz? Kısa yanıt
Kısmen. DynamoDB PartiQL ile gelir;
AWS belgeleri
bunu "Amazon DynamoDB'de veriyi seçmek, eklemek, güncellemek ve silmek için SQL
ile uyumlu bir sorgu dili" olarak tanımlar. Yani SELECT * FROM "Orders" WHERE OrderID = 100 yazabilirsiniz ve çalışır.
Ama PartiQL, DynamoDB API'si üzerinde SQL ile uyumlu bir yüzeydir, bir SQL
motoru değildir. Söz dizimini konuşur; ilişkisel sorgu gücü eklemez. AWS
açıkça "Amazon DynamoDB'nin PartiQL sorgu dilinin bir alt kümesini desteklediğini"
belirtir
(referans).
Bir JOIN'e, bir GROUP BY'a ya da COUNT(*)'a uzandığınız an, PartiQL'in
yapabileceğinin dışındasınız — tam özellik özellik karşılaştırma için bkz.
PartiQL vs SQL.
PartiQL: SQL ile uyumlu bir yüzey, bir SQL motoru değil
PartiQL, SQL'e benzeyen ifadeleri SDK'nın açığa çıkardığı aynı veri düzlemi
işlemlerine eşler. Bir bölüm anahtarı eşitliği olan bir SELECT, bir Query'ye
derlenir; biri olmayan bir SELECT bir Scan'e derlenir.
AWS SELECT referansına
göre:
SELECTifadesini kullanmak, WHERE yan tümcesinde bir bölüm anahtarıyla bir eşitlik ya da IN koşulu sağlanmazsa tam bir tablo taramasıyla sonuçlanabilir.
Yani Query ve Scan'i yöneten aynı erişim deseni kuralları yine geçerlidir —
PartiQL onları sadece tanıdık söz dizimi arkasında gizler. Hiçbir sorgu
planlayıcı, birleştirme ya da küme tabanlı toplama eklemez. Her ifade tek bir yerel
işleme indirgenir:
| Yazdığınız | DynamoDB çalıştırır |
|---|---|
SELECT … WHERE PK = … | GetItem ya da Query |
SELECT … (PK yok) | Scan (tüm tabloyu okur) |
INSERT INTO … | PutItem |
UPDATE … WHERE PK=… AND SK=… | UpdateItem (tek öğe) |
DELETE … WHERE PK=… AND SK=… | DeleteItem (tek öğe) |
Bir işlem tek bir Get/Query/Scan/Put/Update/Delete'e indirgenmezse, PartiQL onu basitçe ifade edemez. Aşağıdaki her şey bu tek gerçeğin bir sonucudur.
PartiQL neyi kapsar
DynamoDB'nin PartiQL'i dört DML/sorgu ifadesini destekler:
- SELECT — öğeleri oku (
Queryya daScan'e derlenir) - INSERT — bir öğe ekle (
PutItem) - UPDATE — bir öğeyi değiştir (
UpdateItem) - DELETE — bir öğeyi kaldır (
DeleteItem)
Ayrıca
işlemleri ve toplu işlemleri
destekler. İyi biçimli bir okuma, bölüm anahtarını bir eşitlik ya da IN ile
hedefler:
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESCORDER BY'a izin verilir, ama AWS referansı sıralama anahtarını "bir karma anahtarı
ya da bir sıralama anahtarı" ile sınırlar — bölüm ya da sıralama anahtarı, keyfî
sütunlar değil. Bu, PartiQL'in SELECT'inin kabul ettiğinin tavanıdır.
Kopyala-yapıştıra hazır ifadeler için bkz. PartiQL örnekleri.
PartiQL'in yapamadıkları
Bunlar, geliştiricilerin "SQL"den en sık beklediği şeylerdir ve PartiQL bunların hiçbirini desteklemez:
JOINyok. PartiQLSELECTsöz dizimi tek birFROM {{table}}[.{{index}}]'dir — bir tablo ya da bir indeks, asla bir anahtar üzerinde ilişkili iki tablo değil. Bu tek tablo tasarımı takasıdır: erişim desenleriniz için önceden modellersiniz çünkü sorgu katmanı veriyi sonradan yeniden şekillendiremez.GROUP BYyok. Gramerde yoktur; satırları gruplayacak bir yan tümce yoktur.- Toplama işlevi yok.
PartiQL işlevleri referansı
"Toplama işlevleri" altında tam olarak bir işlev listeler:
SIZE, ki bu tek bir öğe için bir özniteliğin boyutunu bayt olarak döndürür. Satırlar genelindeCOUNT,SUM,AVG,MINya daMAXyoktur. AWS açıkça belirtir: "Bu listeye dahil edilmeyen herhangi bir SQL işlevi şu anda DynamoDB'de desteklenmemektedir." LIKEyok, alt sorgu yok,UNIONyok, pencere işlevi yok. Desen eşleştirmecontains/begins_withkullanır; geri kalanın hiçbir karşılığı yoktur.
Yani "geçen ay müşteriye göre toplam gelir" — herhangi bir ilişkisel veritabanında
tek satırlık bir GROUP BY — PartiQL'de ifade edilemez. Veriyi tarayıp çıkarır ve
uygulama kodunda toplarsınız.
DynamoDB verisi üzerinde gerçek JOIN / GROUP BY / toplama davranışını elde
etmenin tek yolu, üzerinde gerçek bir SQL motoru çalıştıran bir araçtır. İki
tane var: Amazon Athena'nın federe bağlayıcısı ve DynoTable'ın SQL Workbench'i.
Amazon Athena ile DynamoDB'yi gerçek SQL ile nasıl sorgulanır
AWS'nin "DynamoDB üzerinde gerçek SQL" sorusuna kendi yanıtı
Amazon Athena DynamoDB bağlayıcısıdır;
bu, "Amazon Athena'nın DynamoDB ile iletişim kurmasını sağlar, böylece tablolarınızı
SQL ile sorgulayabilirsiniz." Athena tam bir SQL motoru olduğundan, bu size JOIN
ve toplamaları gerçekten kazandırır — AWS'nin yol gösterimi "Athena
kullanarak Amazon DynamoDB tablolarına erişin, sorgulayın ve birleştirin"
başlıklıdır.
Tuzak kurulum ve maliyettir:
- Hesabınıza dağıttığınız (Athena konsolu ya da Sunucusuz Uygulama Deposu aracılığıyla) Lambda tabanlı bir federe bağlayıcıdır, şema için AWS Glue aracılığıyla bağlanmış ve sonuçları bir S3 paketine döken (bağlayıcı belgeleri).
- Kaputun altında yine DynamoDB'nin
QueryveScanAPI işlemlerini kullanır. AWS, "tarama kullanan sorguların çok sayıda okuma kapasite birimi (RCU) tüketebileceğini" uyarır, böylece büyük bir tablo üzerinde analitik bir sorgu çok sayıda öğe okur — ve ölçer (bağlayıcı maliyetleri). Tarama ağırlıklı bir sorgunun ne kadara mal olacağını ölçmek için öğe boyutu hesaplayıcısını kullanın. INSERT INTOgibi yazma işlemleri bağlayıcı aracılığıyla desteklenmez.
Athena, planlanmış analitik ve BI panoları için doğru araçtır. Günlük "sadece iki tabloyu birleştirip sonuca göz atmam gerekiyor" durumu için ağırdır — bu, bir sonraki bölümün doldurduğu boşluktur.
DynoTable SQL Workbench: DynamoDB'nin erişim deseni kuralları içinde SQL
DynoTable'ın SQL Workbench'i gerçek SQL'i — JOIN, GROUP BY,
COUNT/SUM/AVG — canlı DynamoDB tablolarınıza karşı bir masaüstü istemcisinden
çalıştırır, kurmak için Lambda, Glue ya da S3 olmadan. Satırları DynamoDB'nin
gerçek Query/Scan çalışma zamanı aracılığıyla gerçekleştirir, sonra tam SQL'inizi
üzerinde bellek içi bir motorda çalıştırır:
-- DynoTable Workbench'te çalışır (PartiQL'de DEĞİL):
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'nin erişim deseni kuralları içinde" kısmı önemlidir. Workbench
DynamoDB'nin Postgres olduğunu varsaymaz — kaputun altında yine Query/Scan
aracılığıyla okur, böylece her sorgunun ne kadara mal olduğunun farkında kalırsınız
ve DynamoDB'nin erişim modelini gizlemek yerine uygular:
- Yalnızca
INNER JOINveLEFT JOIN—ONhedef özniteliği bir bölüm anahtarı ya da GSI bölüm anahtarı olmalıdır.RIGHT/FULL/CROSS/ virgül-birleştirme yok. - Henüz kendiyle birleştirme, alt sorgu, türetilmiş tablo, pencere işlevi yok.
- Birleştirmeler ve izdüşümler skaler öznitelikler üzerinde çalışır.
Yalnızca ham API için koşulları ve anahtar ifadelerini oluşturmanız gerekiyorsa —
tam bir SQL ifadesi değil — DynamoDB İfade
Oluşturucu PartiQL yüzeyi hiç olmadan doğru
FilterExpression / KeyConditionExpression'ı üretir.
Amacınız tabloları keşfetmek, hata ayıklamak ve analiz etmek için bir DynamoDB SQL istemcisiyse, Workbench o boşluğu doldurur — ve DynoTable'ın geri kalanı onun etrafındaki tam bir DynamoDB GUI'dir.
Kendi tablolarınıza karşı gerçek SQL çalıştırmak için DynoTable'ı deneyin.
SSS
DynamoDB'de SQL çalıştırabilir misiniz? SQL ile uyumlu bir alt küme olan PartiQL'i çalıştırabilirsiniz (anahtara göre SELECT/INSERT/UPDATE/DELETE). Tam SQL için — JOIN, GROUP BY, toplamalar — üzerinde bir SQL motoruna ihtiyacınız var: Amazon Athena DynamoDB bağlayıcısı ya da DynoTable'ın SQL Workbench'i.
DynamoDB PartiQL JOIN'i destekler mi?
Hayır. PartiQL SELECT söz dizimi tek bir FROM tablosuna ya da indekse sahiptir
ve birleştirme grameri yoktur. Birleştirmeler, DynamoDB üzerinde katmanlanmış bir
motor gerektirir.
PartiQL GROUP BY ya da COUNT ve SUM gibi toplamaları destekler mi?
Hayır. Bir GROUP BY yan tümcesi yoktur ve tek "toplama" işlevi SIZE'dır (bir
öğe için bir özniteliğin bayt boyutu). Satırlar genelinde COUNT, SUM, AVG,
MIN ve MAX desteklenmez.
DynamoDB SQL mı NoSQL mu? NoSQL — bir anahtar-değer ve belge deposu. PartiQL üzerine SQL ile uyumlu bir sorgu dili ekler, ama DynamoDB'nin ilişkisel motoru, birleştirmeleri ya da toplamaları yoktur.
PartiQL geçici sorgular için iyi mi?
Anahtar tabanlı aramalar için evet. Analitik geçici sorgular için (sayımlar,
toplamalar, birleştirmeler) hayır — PartiQL onları ifade edemez ve kısıtlanmamış
SELECT'ler sessizce tam tablo taramaları olur.
JOIN ve GROUP BY'ı işleyen bir DynamoDB SQL istemcisi var mı?
Evet — DynoTable'ın SQL Workbench'i, masaüstünden canlı tablolara karşı
JOIN/GROUP BY/toplamaları çalıştırır ve Amazon Athena bunu AWS hesabınıza
dağıttığınız bir federe bağlayıcı aracılığıyla yapar.