DynamoDB için SQL ve PartiQL'in Sınırları
DynamoDB bir NoSQL anahtar-değer deposudur, ama SQL biçimli soruları insanların
beklediğinden daha çoğunu, umduğundan çok daha azını yanıtlar. Bu, dürüst haritadır:
DynamoDB üzerinde kutudan çıkan SQL nedir, nerede durur ve yerel yüzeyin ifade edemediği
JOIN / GROUP BY / toplama sorgularını çalıştırmanın birkaç yolu nedir.
DynamoDB'yi SQL ile sorgulayabilir misiniz?
Kısmen. DynamoDB, anahtara göre SELECT/INSERT/UPDATE/DELETE için SQL uyumlu bir
dil olan ile gelir; yani
SELECT * FROM "Orders" WHERE OrderID = 100 çalışır. Ama bu, DynamoDB API'sinin üzerinde
SQL uyumlu bir yüzeydir, SQL motoru değil — AWS yalnızca bir alt kümeyi destekler,
dolayısıyla JOIN, GROUP BY ve COUNT(*) kapsam dışıdır. Bunlar için üstüne
katmanlanmış bir motora ihtiyacınız var.
AWS, PartiQL'i şöyle tanımlıyor:
"a SQL-compatible query language, to select, insert, update, and delete data in Amazon DynamoDB",
ama aynı netlikte şunu da söylüyor: "Amazon DynamoDB supports a subset of the PartiQL
query language." Bir JOIN, bir GROUP BY ya da COUNT(*) için uzandığınız an,
PartiQL'in yapabildiklerinin dışına çıkmışsınızdır — özellik özellik tam karşılaştırma
için bkz. PartiQL ile SQL.
PartiQL: SQL uyumlu bir yüzey, SQL motoru değil
PartiQL, SQL görünümlü ifadeleri SDK'nın açtığı veri düzlemi işlemlerinin aynısına
eşler. eşitliği içeren bir SELECT bir Query'ye
derlenir; eşitlik içermeyen bir SELECT ise bir Scan'e.
AWS SELECT referansına
göre:
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.
Yani Query ve Scan'i yöneten aynı erişim deseni kuralları hâlâ geçerlidir — PartiQL
onları yalnızca tanıdık bir sözdiziminin arkasına gizler. Ne sorgu planlayıcı ne join ne
de küme tabanlı toplama ekler. Her ifade tek bir yerel işleme indirgenir:
Bölüm anahtarı eşitliği olmayan bir SELECT, tam tablo Scan'ine derlenir. us-east-1
bölgesinde on-demand modda bu, incelenen her öğe için nihai tutarlı okumada 4 KB
başına 0,5 RCU faturalandırır — 2 KB'lık satırlardan oluşan 500 MB'lık bir
tablo, herhangi bir WHERE filtresi sonucu daraltmadan önce kabaca 125.000 RCU
demektir. PartiQL biçimli okumaları
fiyat hesaplayıcıda fiyatlandırın.
| Siz yazarsı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 çağrısına indirgenmiyorsa, PartiQL onu ifade edemez. Aşağıdaki her şey bu tek gerçeğin sonucudur.
PartiQL'in kapsadıkları
DynamoDB'nin PartiQL'i dört DML/sorgu ifadesini destekler:
- SELECT — öğeleri okur (
Queryya daScan'e derlenir) - INSERT — öğe ekler (
PutItem) - UPDATE — öğe değiştirir (
UpdateItem) - DELETE — öğe kaldırır (
DeleteItem)
Ayrıca
transaction ve batch işlemlerini
destekler. Düzgün kurulmuş bir okuma, bölüm anahtarını bir eşitlikle ya da IN ile
hedefler:
SELECT OrderID, Total
FROM "Orders"
WHERE OrderID IN [1, 2, 3] ORDER BY OrderID DESCORDER BY kullanılabilir, ama AWS referansı sıralama anahtarını "a hash key or a sort
key" ile sınırlar — yani bölüm ya da , keyfi sütunlar değil.
PartiQL'in SELECT ifadesinin kabul ettiği tavan budur. Kopyala-yapıştır hazır ifadeler
için bkz. PartiQL örnekleri.
PartiQL'in yapamadıkları
Geliştiricilerin "SQL"den en çok bekledikleri şunlardır ve PartiQL bunların hiçbirini desteklemez:
JOINyok. PartiQLSELECTsözdizimi tek birFROM {{table}}[.{{index}}]ifadesidir — tek tablo ya da tek dizin, asla bir anahtar üzerinden ilişkilendirilmiş iki tablo değil. Bu, tek tablo tasarımının takasıdır: sorgu katmanı veriyi sonradan yeniden şekillendiremediği için erişim desenlerinize göre baştan modellersiniz.GROUP BYyok. Dilbilgisinde yer almaz; satırları gruplayacak bir yan tümce yoktur.- Toplama işlevi yok.
PartiQL fonksiyon referansı
"Aggregate functions" başlığı altında tam olarak tek bir fonksiyon listeler:
SIZE; o da tek bir öğe için bir attribute'un bayt cinsinden boyutunu döndürür. Satırlar boyuncaCOUNT,SUM,AVG,MINya daMAXyoktur. AWS bunu açıkça söylüyor: "Any SQL functions that are not included in this list are not currently supported in DynamoDB." LIKEyok, alt sorgu yok,UNIONyok, pencere işlevi yok. Desen eşlemecontains/begins_withile yapılır; geri kalanların hiçbir karşılığı yoktur.
Yani "geçen ay müşteri başına toplam gelir" — herhangi bir ilişkisel veritabanında tek
satırlık bir GROUP BY — PartiQL'de ifade edilemez. Veriyi dışarı tarayıp uygulama
kodunda toplamanız gerekir.
DynamoDB verisi üzerinde gerçek JOIN / GROUP BY / toplama davranışı elde etmenin tek
yolu, üstünde gerçek bir SQL motoru çalıştıran bir araçtır. Etkileşimli, anlık
sorgular için iki tanesi var: Amazon Athena'nın federated bağlayıcısı ve DynoTable'ın SQL
Workbench'i. (Zamanlanmış analitik için DynamoDB'nin Amazon Redshift'e sıfır-ETL
entegrasyonu da SQL join ve toplama çalıştırır.)
Amazon Athena ile DynamoDB'yi gerçek SQL kullanarak nasıl sorgularsınız
AWS'nin "DynamoDB üzerinde gerçek SQL" sorusuna kendi cevabı
Amazon Athena DynamoDB bağlayıcısıdır;
bu bağlayıcı "enables Amazon Athena to communicate with DynamoDB so that you can query your tables with SQL."
Athena tam bir SQL motoru olduğu için bu size JOIN ve toplama işlevlerini gerçekten
kazandırır — AWS'nin rehberinin başlığı bile
"Access, query, and join Amazon DynamoDB tables using Athena."
Püf noktası kurulum ve maliyettedir:
- Hesabınıza dağıttığınız (Athena konsolu ya da Serverless Application Repository üzerinden), şema için AWS Glue'ya bağlanan ve sonuçları bir S3 kovasına taşıran Lambda tabanlı bir federated bağlayıcıdır (bağlayıcı belgeleri).
- Altta yine DynamoDB'nin
QueryveScanAPI işlemlerini kullanır. AWS şu uyarıyı yapıyor: "queries that use scans can consume a large number of read capacity units (RCUs)," yani büyük bir tablo üzerindeki analitik bir sorgu çok sayıda öğe okur ve ölçer (bağlayıcı maliyetleri). Tarama ağırlıklı bir sorgunun ne tutacağını ölçmek için öğe boyutu hesaplayıcısını kullanın. INSERT INTOgibi yazma işlemleri bağlayıcı üzerinden desteklenmez.
Athena, zamanlanmış analitik ve BI panoları için doğru araçtır. Gündelik "sadece iki tabloyu birleştirip sonuca göz atmam gerekiyor" durumu içinse ağırdır — bir sonraki bölüm tam da bu boşluğu dolduruyor.
DynoTable SQL Workbench: DynamoDB'nin erişim deseni kuralları içinde SQL
DynoTable'ın SQL Workbench'i, ayağa kaldıracak Lambda, Glue ya da S3 olmadan, bir
masaüstü istemciden canlı DynamoDB tablolarınıza karşı gerçek SQL çalıştırır — JOIN,
GROUP BY, COUNT/SUM/AVG. Satırları DynamoDB'nin gerçek Query/Scan çalışma
zamanı üzerinden materyalize eder, sonra masaüstünüzde yerel olarak tek bir SELECT
çalıştırır:
-- 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'nin erişim deseni kuralları içinde" kısmı önemlidir. Workbench, DynamoDB'nin
Postgres olduğunu iddia etmez — altta yine Query/Scan üzerinden okur, böylece her
sorgunun neye mal olduğunun farkında kalırsınız; ve DynamoDB'nin erişim modelini
gizlemek yerine uygular:
- Yalnızca
INNER JOINveLEFT JOIN—ONhedef attribute'u bir bölüm anahtarı ya da GSI bölüm anahtarı olmalıdır.RIGHT/FULL/CROSS/ virgüllü join yok. - Henüz kendi kendine join yok, alt sorgu yok, türetilmiş tablo yok, pencere işlevi yok.
- Join'ler ve projeksiyonlar skaler attribute'lar üzerinde çalışır.
Tam bir SQL ifadesi değil de yalnızca ham API için koşulları ve anahtar ifadelerini
kurmanız gerekiyorsa,
DynamoDB Expression Builder PartiQL yüzeyine hiç
girmeden doğru FilterExpression / KeyConditionExpression ifadesini ü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 — DynoTable'ın geri kalanı da onun etrafında tam bir DynamoDB GUI'dir.
Kendi tablolarınıza karşı gerçek SQL çalıştırmak için DynoTable'ı deneyin.
SSS
DynamoDB üzerinde SQL çalıştırabilir misiniz? SQL uyumlu bir alt küme olan PartiQL'i çalıştırabilirsiniz (anahtara göre SELECT/INSERT/UPDATE/DELETE). JOIN, GROUP BY ve toplama işlevleri için üstüne bir SQL motoru gerekir: Amazon Athena DynamoDB bağlayıcısı ya da DynoTable'ın SQL Workbench'i — INNER/LEFT JOIN içeren, CTE, union ve alt sorgu içermeyen tek bir SELECT lehçesi.
DynamoDB PartiQL JOIN destekliyor mu?
Hayır. PartiQL SELECT sözdiziminde tek bir FROM tablosu ya da dizini vardır ve join
dilbilgisi yoktur. Join'ler, DynamoDB'nin üzerine katmanlanmış bir motor gerektirir.
PartiQL GROUP BY ya da COUNT ve SUM gibi toplama işlevlerini destekliyor mu?
Hayır. GROUP BY yan tümcesi yoktur ve tek "toplama" fonksiyonu SIZE'dır (tek bir öğe
için bir attribute'un bayt boyutu). Satırlar boyunca COUNT, SUM, AVG, MIN ve
MAX desteklenmez.
DynamoDB SQL mi NoSQL mi? NoSQL — bir anahtar-değer ve doküman deposu. PartiQL üstüne SQL uyumlu bir sorgu dili ekler, ama DynamoDB'nin ilişkisel motoru, join'leri ya da toplama işlevleri yoktur.
PartiQL anlık sorgular için iyi mi?
Anahtar tabanlı aramalar için evet. Analitik anlık sorgular (sayımlar, toplamalar,
join'ler) için hayır — PartiQL bunları ifade edemez ve kısıtlanmamış SELECT'ler
sessizce tam tablo taramasına dönüşür.
JOIN ve GROUP BY yapabilen bir DynamoDB SQL istemcisi var mı?
Evet — DynoTable'ın SQL Workbench'i masaüstünden canlı tablolara karşı
JOIN/GROUP BY/toplama çalıştırır; Amazon Athena da bunu AWS hesabınıza dağıttığınız
bir federated bağlayıcıyla yapar.