Aracılığıyla paylaş


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 bir 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 filtrelenir. Filtrenin eklenmesi Location 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 en fazla eşzamanlı ağ bağlantısı sayısı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 komplekslerine 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 apartman 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 gidebilir. 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 (yayma)

Teslim sürücüsü doğru apartman kompleksini (fiziksel bölüm) bilmiyorsa, her bir apartmana sürmesi ve tüm sakinlerin birim numaralarını (dizin) içeren listeyi denetlemesi gerekir. Sürücü her apartman kompleksine ulaştığında, her bir apartman sakininin adreslerinin listesini kullanmaya devam eder. Ancak, paket alıcılarının orada yaşayıp yaşamadığını, her apartman kompleksinin listesini 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 için dizini 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 kompleksi içinde yaşadığını biliyorsa, her birine sürmeleri gerekmez. Birkaç apartman kompleksine sürüş hala tek bir binayı ziyaret etmekten daha fazla iş gerektirirken, teslimat sürücüsü hala ö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 paralel hale getirmek için birçok iyileştirmeye sahiptir.

Yoğun okuma içeren senaryoların çoğu için sorgu filtrelerinizde en yaygın özelliği seçmenizi öneririz. 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 olmanız gerekir.

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 en fazla 10.000 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: