Başlangıç5 dakikalık okuma

DynamoDB Projeksiyon İfadeleri

Projeksiyon ifadesi DynamoDB'in SELECT col1, col2'ıdır: a GetItem, Query veya Scan belirten isimlerin virgülle ayrılmış listesi öğenin tamamı yerine yalnızca bu nitelikleri döndürmek için.

Do DynamoDB projection expressions reduce read cost?

Hayır. ProjectionExpression faturalandırılan okuma kapasitesini değil yanıt yükünü azaltır. DynamoDB depodaki öğenin tamamını okur, diskteki boyutunu ölçer ve çıkarken adlandırmadığınız nitelikleri bırakır. Okuma maliyetini gerçekten azaltmak için bunun yerine kaplamasını kullanın.

  • Okuma maliyetini değil, veri yükünü azaltır. DynamoDB okur (ve faturalandırır) öğenin tamamını depodan alır, ardından adlandırmadığınız özellikleri yolda bırakır dışarı. ProjectionExpression bir kapasite optimizasyonu değil, bir ağ optimizasyonudur.
  • Genel bir altkümeyi bu şekilde getirirsiniz. Arayanın sahip olduğu birkaç özelliği adlandırın görmesine izin verildi; geri kalanı masadan asla ayrılmıyor.
  • Ayrılmış olabilecek herhangi bir şey için #name yer tutucularını kullanın. Düz İfadedeki nitelik adları DynamoDB'in ~570 ayrılmış sözcüğüyle çarpışıyor ve isteği başarısızlığa uğratın.
  • Gerçek okuma tasarrufu için bunun yerine bir kapsama dizini kullanın. Projeksiyon yapan bir yalnızca ihtiyacınız olan sütunlar kendi (daha küçük) boyutunda okunur.

Gerçekte ne kazandırır

SQL'den itibaren SELECT a, b taramanın SELECT *'den daha az olduğunu varsayarsınız. içinde DynamoDB bu sezgi yanlıştır. Bir okumanın kapasite birimi, öğenin diskteki boyutundan hesaplanır ve sonraki 4 KB'a yuvarlanır — hem de projeksiyon uygulanmadan önce. AWS açıktır: ProjectionExpression değişmez the read capacity a request consumes.1

Yani bir projeksiyon sizi iki şeyden kurtarır; hem gerçek hem de okumanın aşağısında:

  • İletken bayt sayısı. İki küçük özellik olarak döndürülen 6 KB'lik bir öğe çok küçük bir değerdir yanıt. Yüzlerce öğe döndüren bir Query'de bu hızlı bir şekilde toplanır.
  • İstemci tarafında çalışma. Seri durumdan çıkarma işlemi daha az, bellekte daha az tutma, daha az sızıntı kazara bir günlüğe veya API yanıta kaydedilir.

What it does not save is the RCU. Bu tüfek: insanlar bir silaha uzanıyor faturalarını kesme öngörüsü, hiçbir değişiklik görmüyor ve DynamoDB'nın bozulduğu sonucuna varıyor. o isn't — you measured the wrong lever.

Herkese açık bir kullanıcı profilini project et

Bir kullanıcı dizini çalıştırdığınızı varsayalım. Her profil bir öğedir ve anahtarlanmıştır, böylece bir kişi adına:

PK = "PROFILE#ada"      (partition key)
SK = "PROFILE#ada"      (sort key — single-item collection)

Ürün şişmandır. Hesabın halka açık yüzünü ve bir yığın parayı taşır. özel ve operasyonel özellikler:

{
  "PK": "PROFILE#ada",
  "SK": "PROFILE#ada",
  "displayName": "Ada L.",
  "avatarUrl": "https://cdn.example.com/u/ada.png",
  "bio": "Builds things.",
  "emailAddress": "ada@example.com",
  "passwordResetToken": "…",
  "billingCustomerId": "cus_…",
  "lastLoginIp": "…",
  "internalRiskScore": 0.02
}

Genel profil kartının üç alana ihtiyacı vardır. Öğenin tamamının getirilmesi şu anlama gelir: emailAddress, lastLoginIp ve internalRiskScore şu bağlama gider: onları asla görmemeli. Yalnızca genel alt kümeyi adlandırın:

GetItem  PK = "PROFILE#ada"  SK = "PROFILE#ada"
ProjectionExpression: displayName, avatarUrl, bio

Yanıt üç nitelik taşır. Özel olanlar masada kalır - değil after varışından sonra uygulamanız tarafından filtrelendi, ancak hiçbir zaman yanıtta serileştirilmedi hiç de. Bu, güvenliğin kazandığı bir kazançtır ve her seferinde geri alınması zor olan da budur. secret has already crossed a boundary.

Tam olarak bu isteği (adları, yer tutucuları ve SDK'yı) bir araya getirip kopyalayabilirsiniz. çağrı — içinde DynamoDB Expression Builder içinde kurabilirsiniz; ProjectionExpression ve ExpressionAttributeNames haritasını sizin için yayar.

ProjectionExpression’i izlemek için aşağıdaki ön ayardaki alanları ekleyin veya kaldırın. change — only the listed attributes come back:

İsteğini oluştur
Oluşturulan kod
new QueryCommand({
  "TableName": "AuditLog",
  "KeyConditionExpression": "#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)",
  "ProjectionExpression": "#proj0, #proj1, #proj2",
  "ExpressionAttributeNames": {
    "#hashKey": "pk",
    "#rangeKey": "sk",
    "#proj0": "action",
    "#proj1": "actor",
    "#proj2": "createdAt"
  },
  "ExpressionAttributeValues": {
    ":hashKeyValue": {
      "S": "TENANT#acme"
    },
    ":rangeKeyValue": {
      "S": "EVENT#"
    }
  }
})
## Ayrılmış sözcükleri `#` yer tutucularıyla kaçır Ayrılmış kelimeler üzerinde temiz bir projeksiyon patlıyor. DynamoDB uzun bir liste ayırıyor kelimeler — `name`, `status`, `comment`, `sana`, `timestamp` ve daha yüzlercesi.[^ayrılmış] Yansıttığınız bir özellik bunlardan biriyse ifadedeki ham ad reddedilir.

Profilin ayrıca status niteliğine sahip olduğunu varsayalım ("active", "suspended"). Bu başarısız olur:

ProjectionExpression   displayName, status

status ayrılmıştır. Düzeltme bir ifade öznitelik adıdır# ön ekidir gerçek isimle eşlenen yer tutucu:

ProjectionExpression       displayName, #s
ExpressionAttributeNames   { "#s": "status" }

Aynı mekanizma iç içe geçmiş niteliklere de ulaşır. Tek bir alanı çıkarmak için bir harita veya bir listenin bir öğesi, belge yolu sözdizimini ve her birinde yer tutucuyu kullanır segment, çünkü bunlardan herhangi biri rezerve edilebilir:

ProjectionExpression       #addr.#city, tags[0]
ExpressionAttributeNames   { "#addr": "address", "#city": "city" }

Pratik bir kural: her şeyin yer tutucusu. Hangisini asla hatırlamanıza gerek yok ~570 ayrılmış kelime üzerinde duruyorsunuz ve ifade de aynı şekilde okunuyor yol. Hangi adların gerçekten sorun olduğunu bilmek istiyorsanız bunları yapıştırın reserved-words checker içine — o çarpışmaları işaretler ve ExpressionAttributeNames takma ad haritasını yayınlar.

Covering bir indeks ne zaman projeksiyondan üstündür

Yalnızca veri yükünü değil, okuma maliyetini de gerçekten düşürmeniz gerekiyorsa, kaldıraç Küresel İkincil Dizin yalnızca okuduğunuz nitelikleri yansıtır. GSI bir separate copy of the data; için KEYS_ONLY, INCLUDE veya ALL öğesini seçersiniz. projeksiyon.3 KEYS_ONLY veya dar INCLUDE indeksi fiziksel olarak öğe başına daha küçük olduğundan, buna karşı Query daha küçük boyutta ölçülür.

Bu bir kapsama dizini: sorgu tamamen dizinden yanıtlanıyor, hayır temel masaya geri dönün. Sıcak okuma deseninin yalnızca birkaç taneye ihtiyacı olduğunda bunu kullanın. attributes from large items.

ProjectionExpressionKaplama GSI
Yükü azaltırEvetEvet
Okuma maliyetini azaltırHayırYes — read at the index's sana
Ekstra depolamaNoneÖngörülen alanların ikinci bir kopyası
Ekstra yazma maliyetiYokWrites propagate to the index
Şunun için en iyisiÖzel alanların gizlenmesi; küçük zaferlerBüyük öğelerden birkaç alanın sıcak okumaları

Takas dürüsttür: endeks, tasarruf etmek için depolama ve yazma kapasitesine mal olur okuma kapasitesi. Ağır bir eşyanın ince bir dilimini sık sık okumak için buna değer; tek seferlik bir GetItem tıraş etmeye değmez. Bkz. Dizin türünü seçmek için GSI ile LSI ve when a GSI read can be stale önce birini sıcak yola koyarsın.

Tuzaklar ve sonraki adımlar

  • Daha küçük bir fatura beklemeyin. Tek başına bir tahmin, RCU'yu asla değiştirmez. Eğer numara hareket etmedi, bu belgelenmiş bir davranıştır, bir hata değil.
  • Yer tutucuya ayrılmış sözcükler. İfadede yalnızca name veya status istek başarısız olursa — #-haritalayın.
  • Her zaman temel özellikleri ekleyin — ihmal edilebilir düzeyde yük eklerler ve sayfaya geçersiniz veya öğeyi yeniden getirirsiniz.
  • Kapsama endeksine ulaşın yalnızca sıcak bir model birkaç alanı okuduğunda büyük eşyalar; önce yazma/depolama maliyetini tartın.

ProjectionExpression ve onun öznitelik adı haritasını oluşturun. Expression Builder ve try DynoTable bu projeksiyonları kendi masalarınıza göre çalıştırmak ve tepkinin küçülmesini izleyin.


  1. AWS DynamoDB Geliştirici Kılavuzu, DynamoDB'de projeksiyon ifadelerinin kullanılması — okuma kapasitesi, herhangi bir ProjectionExpression uygulanmadan önceki öğe boyutuna bağlıdır. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html
  2. AWS DynamoDB Geliştirici Kılavuzu, DynamoDB'da Rezerve Edilmiş Kelimeler. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html
  3. AWS DynamoDB Geliştirici Kılavuzu, Attribute Projections (KEYS_ONLY / INCLUDE / ALL). https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

Güncellendi