Başlangıç7 dakikalık okuma

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:

SELECT ifadesini 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ızDynamoDB ç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 (Query ya da Scan'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 DESC

ORDER 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:

  • JOIN yok. PartiQL SELECT söz dizimi tek bir FROM {{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 BY yok. 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 genelinde COUNT, SUM, AVG, MIN ya da MAX yoktur. AWS açıkça belirtir: "Bu listeye dahil edilmeyen herhangi bir SQL işlevi şu anda DynamoDB'de desteklenmemektedir."
  • LIKE yok, alt sorgu yok, UNION yok, pencere işlevi yok. Desen eşleştirme contains / begins_with kullanı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 Query ve Scan API 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 INTO gibi 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 JOIN ve LEFT JOINON hedef ö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.

Güncellendi