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ı.
ProjectionExpressionbir 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
#nameyer 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:
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.
ProjectionExpression | Kaplama GSI | |
|---|---|---|
| Yükü azaltır | Evet | Evet |
| Okuma maliyetini azaltır | Hayır | Yes — read at the index's sana |
| Ekstra depolama | None | Öngörülen alanların ikinci bir kopyası |
| Ekstra yazma maliyeti | Yok | Writes propagate to the index |
| Şunun için en iyisi | Özel alanların gizlenmesi; küçük zaferler | Bü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
nameveyastatusistek 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.
- AWS DynamoDB Geliştirici Kılavuzu, DynamoDB'de projeksiyon ifadelerinin kullanılması — okuma kapasitesi, herhangi bir
ProjectionExpressionuygulanmadan önceki öğe boyutuna bağlıdır. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ProjectionExpressions.html ↩ - AWS DynamoDB Geliştirici Kılavuzu, DynamoDB'da Rezerve Edilmiş Kelimeler. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html ↩
- AWS DynamoDB Geliştirici Kılavuzu, Attribute Projections (
KEYS_ONLY/INCLUDE/ALL). https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html ↩