Azure Cosmos DB kapsayıcısı sorgulama

UYGULANANLAR: NOSQL

Bu makalede Azure Cosmos DB'de bir kapsayıcının (koleksiyon, grafik veya tablo) nasıl sorgu yapılacağı açıklanmaktadır. Özellikle, Azure Cosmos DB'de bölüm içi ve bölümler arası sorguların nasıl çalıştığını kapsar.

Bölüm içi sorgu

Kapsayıcılardan veri sorguladığınızda, sorguda bölüm anahtarı filtresi belirtilmişse Azure Cosmos DB sorguyu otomatik olarak iyileştirir. Sorguyu filtrede belirtilen bölüm anahtarı değerlerine karşılık gelen fiziksel bölümlere yönlendirir.

Örneğin, üzerinde DeviceIdeşitlik filtresi olan aşağıdaki sorguyu göz önünde bulundurun. Bu sorguyu üzerinde bölümlenmiş bir kapsayıcıda DeviceIdçalıştırırsak, bu sorgu tek bir fiziksel bölüme filtrelenir.

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'

Önceki örnekte olduğu gibi, bu sorgu da tek bir bölüme filtre ekler. Filtrenin Location eklenmesi aşağıdaki sorguyu değiştirmez:

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'

Bölüm anahtarında aralık filtresi olan ve kapsamı tek bir fiziksel bölüm olarak belirtilmeyen bir sorgu aşağıdadır. Bölüm içi sorgu olmak için sorgunun bölüm anahtarını içeren bir eşitlik filtresi olmalıdır:

SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'

Bölümler arası sorgu

Aşağıdaki sorgunun bölüm anahtarıDeviceId ( ) üzerinde bir filtresi yoktur. Bu nedenle, her bölümün dizininde çalıştırıldığı tüm fiziksel bölümlere yayılmalıdır:

SELECT * FROM c WHERE c.Location = 'Seattle`

Her fiziksel bölümün kendi dizini vardır. Bu nedenle, bir kapsayıcıda bölümler arası sorgu çalıştırdığınızda, fiziksel bölüm başına etkili bir şekilde bir sorgu çalıştırırsınız. Azure Cosmos DB, sonuçları farklı fiziksel bölümlerde otomatik olarak toplar.

Farklı fiziksel bölümlerdeki dizinler birbirinden bağımsızdır. Azure Cosmos DB'de genel dizin yoktur.

Paralel bölümler arası sorgu

Azure Cosmos DB SDK'ları 1.9.0 ve üzeri paralel sorgu yürütme seçeneklerini destekler. Paralel bölümler arası sorgular, düşük gecikme süreli bölümler arası sorgular yürütmenize olanak tanır.

Aşağıdaki parametreleri ayarlayarak paralel sorgu yürütme işlemini yönetebilirsiniz:

  • MaxConcurrency: Kapsayıcının bölümlerine eş zamanlı ağ bağlantısı sayısı üst sınırını ayarlar. Bu özelliği olarak -1ayarlarsanız SDK paralellik derecesini yönetir. MaxConcurrency olarak ayarlanırsa0, kapsayıcının bölümlerine tek bir ağ bağlantısı vardır.

  • MaxBufferedItemCount: Sorgu gecikme süresiyle istemci tarafı bellek kullanımı arasında denge kurar. Bu seçenek atlanırsa veya -1 olarak ayarlanırsa, SDK paralel sorgu yürütme sırasında arabelleğe alınan öğe sayısını yönetir.

Azure Cosmos DB'nin bölümler arası sorguları paralel hale getirebilmesi nedeniyle sorgu gecikmesi genellikle ölçeklendirilir ve sistem fiziksel bölümler ekler. Ancak, toplam fiziksel bölüm sayısı arttıkça RU ücreti önemli ölçüde artar.

Bölümler arası sorgu çalıştırdığınızda temelde her fiziksel bölüm için ayrı bir sorgu yaparsınız. Bölümler arası sorgular dizini kullansa da, varsa, yine de bölüm içi sorgular kadar verimli değildir.

Yararlı örnek

Bölümler arası sorguları daha iyi açıklayan bir benzetme aşağıdadır:

Paketleri farklı apartman sitelerine teslim etmek zorunda olan bir teslimat sürücüsü olduğunuzu düşünün. Her apartman kompleksinde, tüm sakinlerin birim numaralarını içeren bir liste vardır. Her bir daire kompleksini fiziksel bölümle ve her listeyi fiziksel bölümün diziniyle karşılaştırabiliriz.

Bu örneği kullanarak bölüm içi ve bölümler arası sorguları karşılaştırabiliriz:

Bölüm içi sorgu (örnek)

Teslim sürücüsü doğru apartman kompleksini (fiziksel bölüm) biliyorsa, hemen doğru binaya gidebilirler. Sürücü, apartman kompleksinin yerleşik birim numaralarının (dizin) listesini kontrol edebilir ve uygun paketleri hızlı bir şekilde teslim edebilir. Bu durumda sürücü, herhangi bir paket alıcısının orada yaşayıp yaşamadığı kontrol etmek için bir apartman kompleksine gitmek için zaman veya çaba harcamaz.

Bölümler arası sorgu (fan-out)

Teslim sürücüsü doğru apartman kompleksini (fiziksel bölüm) bilmiyorsa, her bir apartmana gidip tüm sakinlerin birim numaralarını (dizin) içeren listeyi kontrol etmeleri gerekir. Sürücü her apartman kompleksine ulaştığında, her bir sakinin adres listesini kullanmaya devam eder. Ancak, her daire kompleksinin listesini, paket alıcılarının orada yaşayıp yaşamadığını denetlemeleri gerekir. Bu örnek, bölümler arası sorguların nasıl çalıştığıdır. Dizini kullanabiliyor olsalar da (yani her kapıyı çalmaları gerekmez), ancak her fiziksel bölümün dizinini ayrı ayrı denetlemeleri gerekir.

Bölümler arası sorgu (kapsamı yalnızca birkaç fiziksel bölüm olarak belirlenmiştir)

Teslim sürücüsü, tüm paket alıcılarının belirli birkaç apartman kompleksinde yaşadığını biliyorsa, her birine sürmeleri gerekmez. Birkaç daire kompleksine sürüş hala tek bir binayı ziyaret etmekten daha fazla iş gerektirirken, teslimat sürücüsü yine de önemli ölçüde zaman ve çaba tasarrufu sağlar. Sorgunun filtresinde anahtar sözcüğüyle IN bölüm anahtarı varsa, yalnızca ilgili fiziksel bölümün dizinlerinde veri olup olmadığını denetler.

Bölümler arası sorgulardan kaçının

Çoğu kapsayıcı için bazı bölümler arası sorgular olması kaçınılmazdır, bu sorun değil! Neredeyse tüm sorgu işlemleri hem mantıksal bölüm anahtarları hem de fiziksel bölümler için bölümler arasında desteklenir. Azure Cosmos DB ayrıca sorgu altyapısında ve istemci SDK'larında fiziksel bölümler arasında sorgu yürütmeyi paralelleştirmek için birçok iyileştirmeye sahiptir.

Yoğun okuma içeren senaryoların çoğunda, sorgu filtrelerinizde en yaygın özelliği seçmeniz önerilir. Ayrıca bölüm anahtarınızın diğer bölüm anahtarı seçimi en iyi yöntemlerine uydığından da emin olmalısınız.

Bölümler arası sorgulardan kaçınmak genellikle yalnızca büyük kapsayıcılarda önemlidir. Fiziksel bölümdeki hiçbir öğe sorgunun filtresiyle eşleşmese bile sonuçlar için fiziksel bölümün dizinini her denetlediğinizde en az 2,5 RU ücretlendirilirsiniz. Bu nedenle, yalnızca bir (veya yalnızca birkaç) fiziksel bölümünüz varsa, bölümler arası sorgular bölüm içi sorgulardan önemli ölçüde daha fazla RU kullanmaz.

Fiziksel bölüm sayısı sağlanan RU miktarına bağlıdır. Her fiziksel bölüm 10.000'e kadar sağlanan RU'ya izin verir ve 50 GB'a kadar veri depolayabilir. Azure Cosmos DB fiziksel bölümleri sizin için otomatik olarak yönetir. Kapsayıcınızdaki fiziksel bölüm sayısı, sağlanan aktarım hızınıza ve tüketilen depolama alanınıza bağlıdır.

İş yükünüz aşağıdaki ölçütleri karşılıyorsa bölümler arası sorgulardan kaçınmayı denemelisiniz:

  • 30.000'den fazla RU sağlamayı planlıyorsunuz
  • 100 GB'ın üzerinde veri depolamayı planlıyorsunuz

Sonraki adımlar

Azure Cosmos DB'de bölümleme hakkında bilgi edinmek için aşağıdaki makalelere bakın: