Başlangıç7 dakikalık okuma

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

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

  • JOIN yok. PartiQL SELECT sözdizimi tek bir FROM {{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 BY yok. 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 boyunca COUNT, SUM, AVG, MIN ya da MAX yoktur. AWS bunu açıkça söylüyor: "Any SQL functions that are not included in this list are not currently supported in DynamoDB."
  • LIKE yok, alt sorgu yok, UNION yok, pencere işlevi yok. Desen eşleme contains / begins_with ile 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 Query ve Scan API 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 INTO gibi 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 JOIN ve LEFT JOINON hedef 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.

Güncellendi