Share via


Azure Cosmos DB SDK'ları için sorgu performansı ipuçları

UYGULANANLAR: NoSQL

Azure Cosmos DB, garantili gecikme süresi ve aktarım hızı düzeyleriyle sorunsuz bir şekilde ölçeklendirilen hızlı, esnek bir dağıtılmış veritabanıdır. Azure Cosmos DB ile veritabanınızı ölçeklendirmek için büyük mimari değişiklikleri yapmanız veya karmaşık kod yazmanız gerekmez. Ölçeği artırma ve azaltma, tek bir API çağrısı yapmak kadar kolaydır. Daha fazla bilgi edinmek için bkz . Kapsayıcı aktarım hızı sağlama veya veritabanı aktarım hızı sağlama.

Sorgu Planı çağrılarını azaltma

Sorguyu yürütmek için bir sorgu planının derlenmesi gerekir. Bu genellikle Azure Cosmos DB Ağ Geçidi'ne yönelik bir ağ isteğini temsil eder ve bu da sorgu işleminin gecikme süresini artırır. Bu isteği kaldırmanın ve sorgu işleminin gecikme süresini azaltmanın iki yolu vardır:

İyimser Doğrudan Yürütme ile tek bölümlü sorguları iyileştirme

Azure Cosmos DB NoSQL, belirli NoSQL sorgularının verimliliğini artırabilen İyimser Doğrudan Yürütme (ODE) adlı bir iyileştirmeye sahiptir. Özellikle, dağıtım gerektirmeyen sorgular, tek bir fiziksel bölümde yürütülebilen veya sayfalandırma gerektirmeyen yanıtlara sahip olan sorguları içerir. Dağıtım gerektirmeyen sorgular, istemci tarafı sorgu planı oluşturma ve sorgu yeniden yazma gibi bazı işlemleri güvenle atlayarak sorgu gecikme süresini ve RU maliyetini azaltabilir. İstekte veya sorguda bölüm anahtarını belirtirseniz (veya yalnızca bir fiziksel bölüme sahipseniz) ve sorgunuzun sonuçları sayfalandırma gerektirmezse, ODE sorgularınızı geliştirebilir.

Not

Dağıtım gerektirmeyen sorgular için gelişmiş performans sunan İyimser Doğrudan Yürütme (ODE), uygulamanızı arka uç çoğaltmalarına bağlamak için bir yol olan Doğrudan Mod ile karıştırılmamalıdır.

ODE artık .NET SDK sürüm 3.38.0 ve sonraki sürümlerde varsayılan olarak kullanılabilir ve etkindir. Bir sorgu yürütür ve istekte veya sorguda bir bölüm anahtarı belirtirseniz veya veritabanınızda yalnızca bir fiziksel bölüm varsa, sorgu yürütmeniz ODE'nin avantajlarından yararlanabilir. ODE'yi devre dışı bırakmak için QueryRequestOptions içinde EnableOptimisticDirectExecution değerini false olarak ayarlayın.

GROUP BY, ORDER BY, DISTINCT ve toplama işlevlerini (toplam, ortalama, min ve max gibi) içeren tek bölüm sorguları, ODE'yi kullanmaktan önemli ölçüde yararlanabilir. Ancak, sorgunun birden çok bölümü hedeflediği veya hala sayfalandırma gerektirdiği senaryolarda, sorgu yanıtının gecikme süresi ve RU maliyeti ODE kullanılmadan daha yüksek olabilir. Bu nedenle, ODE kullanırken şunları öneririz:

  • Çağrı veya sorgunun kendisinde bölüm anahtarını belirtin.
  • Veri boyutunuzun büyümediğinden ve bölümün bölünmesine neden olduğundan emin olun.
  • ODE'nin tüm avantajlarından yararlanmak için sorgu sonuçlarınızın sayfalandırma gerektirmediğinden emin olun.

Aşağıda, ODE'den yararlanabilecek basit tek bölüm sorgularının birkaç örneği verilmiştir:

- SELECT * FROM r
- SELECT * FROM r WHERE r.pk == "value"
- SELECT * FROM r WHERE r.id > 5
- SELECT r.id FROM r JOIN id IN r.id
- SELECT TOP 5 r.id FROM r ORDER BY r.id
- SELECT * FROM r WHERE r.id > 5 OFFSET 5 LIMIT 3 

Zaman içinde veri öğelerinin sayısı artarsa ve Azure Cosmos DB veritabanınız bölümü bölerse tek bölüm sorgularının yine de dağıtım gerektirebileceği durumlar olabilir. Bunun gerçekleşebileceği sorgulara örnek olarak şunlar verilebilir:

- SELECT Count(r.id) AS count_a FROM r
- SELECT DISTINCT r.id FROM r
- SELECT Max(r.a) as min_a FROM r
- SELECT Avg(r.a) as min_a FROM r
- SELECT Sum(r.a) as sum_a FROM r WHERE r.a > 0 

Bazı karmaşık sorgular tek bir bölümü hedeflese bile her zaman dağıtım gerektirebilir. Bu tür sorgulara örnek olarak şunlar verilebilir:

- SELECT Sum(id) as sum_id FROM r JOIN id IN r.id
- SELECT DISTINCT r.id FROM r GROUP BY r.id
- SELECT DISTINCT r.id, Sum(r.id) as sum_a FROM r GROUP BY r.id
- SELECT Count(1) FROM (SELECT DISTINCT r.id FROM root r)
- SELECT Avg(1) AS avg FROM root r 

ODE'nin her zaman sorgu planını almayabileceğini ve sonuç olarak desteklenmeyen sorgulara izin vermediğini veya kapatamadığını unutmayın. Örneğin, bölüm bölündükten sonra bu tür sorgular artık ODE için uygun değildir ve bu nedenle istemci tarafı sorgu planı değerlendirmesi bunları engelleyeceği için çalışmaz. Uyumluluk/hizmet sürekliliğini sağlamak için, yalnızca ODE içermeyen senaryolarda tam olarak desteklenen sorguların (yani, genel çok bölümlü durumda doğru sonucu yürütür ve üretirler) ODE ile kullanıldığından emin olmak kritik önem taşır.

Not

ODE'nin kullanılması potansiyel olarak yeni bir devamlılık belirteci türünün oluşturulmasına neden olabilir. Böyle bir belirteç, eski SDK'lar tarafından tasarım gereği tanınmaz ve bu durum Hatalı Biçimlendirilmiş Devamlılık Belirteci Özel Durumu ile sonuçlanabilir. Daha yeni SDK'lardan oluşturulan belirteçlerin eski bir SDK tarafından kullanıldığı bir senaryonuz varsa, yükseltme için 2 adımlı bir yaklaşım öneririz:

  • Yeni SDK'ya yükseltin ve tek bir dağıtımın parçası olarak ODE'yi devre dışı bırakın. Tüm düğümlerin yükseltmesini bekleyin.
    • ODE'yi devre dışı bırakmak için QueryRequestOptions içinde EnableOptimisticDirectExecution değerini false olarak ayarlayın.
  • Tüm düğümler için ikinci dağıtımın bir parçası olarak ODE'yi etkinleştirin.

Yerel Sorgu Planı oluşturmayı kullanma

SQL SDK'sı sorguları yerel olarak ayrıştırmak ve iyileştirmek için yerel bir ServiceInterop.dll içerir. ServiceInterop.dll yalnızca Windows x64 platformunda desteklenir. Aşağıdaki uygulama türleri varsayılan olarak 32 bit konak işleme kullanır. Konak işlemeyi 64 bit işleme olarak değiştirmek için uygulamanızın türüne göre şu adımları izleyin:

  • Yürütülebilir uygulamalar için, Derleme sekmesindeki Proje Özellikleri penceresinde platform hedefinix64 olarak ayarlayarak konak işlemeyideğiştirebilirsiniz.

  • VSTest tabanlı test projeleri için, Visual StudioTest menüsünde Test>Testi Ayarlar> Default İşlemci Mimarisi'ni X64 olarak seçerek konak işlemeyi değiştirebilirsiniz.

  • Yerel olarak dağıtılan ASP.NET web uygulamaları için, Araç>Seçenekleri>Projeleri ve Çözümleri>Web Projeleri altında Web siteleri ve projeler için IIS Express'in 64 bit sürümünü kullan'ı seçerek konak işlemeyi değiştirebilirsiniz.

  • Azure'da dağıtılan ASP.NET web uygulamaları için, Azure portalındaki Uygulama ayarlarından 64 bit platformu seçerek konak işlemeyi değiştirebilirsiniz.

Not

Varsayılan olarak, yeni Visual Studio projeleri Herhangi bir CPU olarak ayarlanır. Projenizi x86'ya geçmemesi için x64 olarak ayarlamanızı öneririz. Herhangi bir CPU olarak ayarlanmış bir proje, yalnızca x86 bağımlılığı eklendiğinde kolayca x86'ya geçebilir.
ServiceInterop.dll SDK DLL'sinin yürütülmekte olduğu klasörde olması gerekir. Bu, yalnızca DLL'leri el ile kopyaladığınızda veya özel derleme/dağıtım sistemlerine sahipseniz sorun oluşturmalıdır.

Tek bölüm sorgularını kullanma

içinde PartitionKey özelliğini QueryRequestOptions ayarlayarak bir Bölüm Anahtarını hedefleyen ve toplama içermeyen sorgular için (Distinct, DCount, Group By dahil). Bu örnekte, bölüm anahtarı alanı /state değerine Washingtongöre filtrelenmiştir.

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle' AND c.state = 'Washington'"
{
    // ...
}

İsteğe bağlı olarak, bölüm anahtarını istek seçenekleri nesnesinin bir parçası olarak sağlayabilirsiniz.

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle'",
    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Washington")}))
{
    // ...
}

Not

Bölümler arası sorgular, SDK'nın sonuçları denetlemek için mevcut tüm bölümleri ziyaret etmelerini gerektirir. Kapsayıcı ne kadar çok fiziksel bölüme sahip olursa, o kadar yavaş olabilir.

Yineleyiciyi gereksiz yere yeniden oluşturmaktan kaçının

Tüm sorgu sonuçları geçerli bileşen tarafından tüketildiğinde, yineleyiciyi her sayfa için devamlılık ile yeniden oluşturmanız gerekmez. Sayfalandırma başka bir çağrı bileşeni tarafından denetlenmediği sürece her zaman sorguyu tamamen boşaltmayı tercih edin:

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle'",
    requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Washington")}))
{
    while (feedIterator.HasMoreResults) 
    {
        foreach(MyItem document in await feedIterator.ReadNextAsync())
        {
            // Iterate through documents
        }
    }
}

Paralellik derecesini ayarlama

Sorgular için, özellikle bölümler arası sorgular gerçekleştiriyorsanız (bölüm anahtarı değerine filtre uygulamadan) uygulamanız için en iyi yapılandırmaları belirlemek için maxconcurrency özelliğini QueryRequestOptions ayarlayın. MaxConcurrency paralel görev sayısı üst sınırını, yani paralel olarak ziyaret edilecek bölüm sayısını denetler. Değeri -1 olarak ayarlamak, SDK'nın en uygun eşzamanlılığa karar vermesine olanak sağlar.

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle'",
    requestOptions: new QueryRequestOptions() { 
        PartitionKey = new PartitionKey("Washington"),
        MaxConcurrency = -1 }))
{
    // ...
}

Bunu varsayalım

  • D = Varsayılan En fazla paralel görev sayısı (= istemci makinesindeki toplam işlemci sayısı)
  • P = Kullanıcı tarafından belirtilen en fazla paralel görev sayısı
  • N = Sorguyu yanıtlamak için ziyaret edilmesi gereken bölüm sayısı

Aşağıda, paralel sorguların P'nin farklı değerleri için nasıl davranacağı üzerindeki etkileri yer alır.

  • (P == 0) => Seri Modu
  • (P == 1) => En fazla bir görev
  • (P > 1) => Min (P, N) paralel görevler
  • (P < 1) => Min (N, D) paralel görevler

Sayfa boyutunu ayarlama

SQL sorgusu gönderdiğinizde, sonuç kümesi çok büyükse sonuçlar kesimli bir şekilde döndürülür.

Not

MaxItemCount özelliği yalnızca sayfalandırma için kullanılmamalıdır. Ana kullanım alanı, tek bir sayfada döndürülen en fazla öğe sayısını azaltarak sorguların performansını artırmaktır.

Kullanılabilir Azure Cosmos DB SDK'larını kullanarak da sayfa boyutunu ayarlayabilirsiniz. içindeki QueryRequestOptions MaxItemCount özelliği, numaralandırma işleminde döndürülecek en fazla öğe sayısını ayarlamanıza olanak tanır. MaxItemCount-1 olarak ayarlandığında, SDK belge boyutuna bağlı olarak en uygun değeri otomatik olarak bulur. Örneğin:

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle'",
    requestOptions: new QueryRequestOptions() { 
        PartitionKey = new PartitionKey("Washington"),
        MaxItemCount = 1000}))
{
    // ...
}

Bir sorgu yürütülürken, sonuçta elde edilen veriler bir TCP paketi içinde gönderilir. için çok düşük bir değer belirtirseniz, TCP paketi içindeki verileri göndermek için MaxItemCountgereken yolculuk sayısı yüksektir ve bu da performansı etkiler. Bu nedenle özellik için MaxItemCount hangi değerin ayarlanacağından emin değilseniz en iyisi bunu -1 olarak ayarlamak ve SDK'nın varsayılan değeri seçmesine izin vermektir.

Arabellek boyutunu ayarlama

Paralel sorgu, geçerli sonuç toplu işlemi istemci tarafından işlenirken sonuçları önceden getirmek için tasarlanmıştır. Bu ön getirme, bir sorgunun genel gecikme süresini iyileştirmeye yardımcı olur. içindeki QueryRequestOptions MaxBufferedItemCount özelliği, önceden getirilen sonuçların sayısını sınırlar. Sorgunun ön getirmeden en yüksek avantajı almasına izin vermek için döndürülen beklenen sonuç sayısına (veya daha yüksek bir sayıya) ayarlayın MaxBufferedItemCount . Bu değeri -1 olarak ayarlarsanız, sistem arabelleğe alınacak öğe sayısını otomatik olarak belirler.

using (FeedIterator<MyItem> feedIterator = container.GetItemQueryIterator<MyItem>(
    "SELECT * FROM c WHERE c.city = 'Seattle'",
    requestOptions: new QueryRequestOptions() { 
        PartitionKey = new PartitionKey("Washington"),
        MaxBufferedItemCount = -1}))
{
    // ...
}

Önceden getirme, paralellik derecesinden bağımsız olarak aynı şekilde çalışır ve tüm bölümlerdeki veriler için tek bir arabellek vardır.

Sonraki adımlar

.NET SDK'sını kullanarak performans hakkında daha fazla bilgi edinmek için:

Sorgu Planı çağrılarını azaltma

Sorguyu yürütmek için bir sorgu planının derlenmesi gerekir. Bu genellikle Azure Cosmos DB Ağ Geçidi'ne yönelik bir ağ isteğini temsil eder ve bu da sorgu işleminin gecikme süresini artırır.

Sorgu Planı önbelleğini kullanma

Tek bir bölüm kapsamındaki bir sorgu için sorgu planı istemcide önbelleğe alınır. Bu, ilk çağrıdan sonra sorgu planını almak için ağ geçidine çağrı yapma gereksinimini ortadan kaldırır. Önbelleğe alınan sorgu planının anahtarı SQL sorgu dizesidir. Sorgunun parametrik olduğundan emin olmanız gerekir. Aksi takdirde, sorgu dizesinin çağrılar arasında aynı olma olasılığı düşük olduğundan sorgu planı önbellek araması genellikle bir önbellek kaçırması olur. Sorgu planı önbelleğe alma, Java SDK sürüm 4.20.0 ve üzeri ile Spring Data Azure Cosmos DB SDK sürüm 3.13.0 ve üzeri için varsayılan olarak etkindir.

Parametrized tek bölüm sorgularını kullanma

içinde setPartitionKeyCosmosQueryRequestOptions ile bir bölüm anahtarı kapsamına alınmış ve toplama içermeyen (Distinct, DCount, Group By dahil) parametrized sorgular için sorgu planı önlenebilir:

CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();
options.setPartitionKey(new PartitionKey("Washington"));

ArrayList<SqlParameter> paramList = new ArrayList<SqlParameter>();
paramList.add(new SqlParameter("@city", "Seattle"));
SqlQuerySpec querySpec = new SqlQuerySpec(
        "SELECT * FROM c WHERE c.city = @city",
        paramList);

//  Sync API
CosmosPagedIterable<MyItem> filteredItems = 
    container.queryItems(querySpec, options, MyItem.class);

//  Async API
CosmosPagedFlux<MyItem> filteredItems = 
    asyncContainer.queryItems(querySpec, options, MyItem.class);

Not

Bölümler arası sorgular, SDK'nın sonuçları denetlemek için mevcut tüm bölümleri ziyaret etmelerini gerektirir. Kapsayıcı ne kadar çok fiziksel bölüme sahip olursa, o kadar yavaş olabilir.

Paralellik derecesini ayarlama

Paralel sorgular, birden çok bölümü paralel olarak sorgulayarak çalışır. Ancak, tek bir bölümlenmiş kapsayıcıdaki veriler sorguya göre seri olarak getirilir. Bu nedenle, değeri sahip olduğunuz bölüm sayısına ayarlamak için setMaxDegreeOfParallelism değerini kullanın.CosmosQueryRequestOptions Bölüm sayısını bilmiyorsanız, yüksek bir sayı ayarlamak için kullanabilirsiniz setMaxDegreeOfParallelism ve sistem en yüksek paralellik derecesi olarak en düşük (bölüm sayısı, kullanıcı tarafından sağlanan giriş) seçer. Değeri -1 olarak ayarlamak, SDK'nın en uygun eşzamanlılığa karar vermesine olanak sağlar.

Veriler sorguya göre tüm bölümlere eşit olarak dağıtılıyorsa, paralel sorguların en iyi avantajları sağladığını unutmayın. Bölümlenmiş kapsayıcı, sorgu tarafından döndürülen verilerin tümünün veya çoğunluğunun birkaç bölümde (en kötü durumda bir bölüm) yoğunlaşacağı şekilde bölümlenmişse sorgunun performansı düşürülür.

CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();
options.setPartitionKey(new PartitionKey("Washington"));
options.setMaxDegreeOfParallelism(-1);

// Define the query

//  Sync API
CosmosPagedIterable<MyItem> filteredItems = 
    container.queryItems(querySpec, options, MyItem.class);

//  Async API
CosmosPagedFlux<MyItem> filteredItems = 
    asyncContainer.queryItems(querySpec, options, MyItem.class);

Bunu varsayalım

  • D = Varsayılan En fazla paralel görev sayısı (= istemci makinesindeki toplam işlemci sayısı)
  • P = Kullanıcı tarafından belirtilen en fazla paralel görev sayısı
  • N = Sorguyu yanıtlamak için ziyaret edilmesi gereken bölüm sayısı

Aşağıda, paralel sorguların P'nin farklı değerleri için nasıl davranacağı üzerindeki etkileri yer alır.

  • (P == 0) => Seri Modu
  • (P == 1) => En fazla bir görev
  • (P > 1) => Min (P, N) paralel görevler
  • (P == -1) => Min (N, D) paralel görevler

Sayfa boyutunu ayarlama

SQL sorgusu gönderdiğinizde, sonuç kümesi çok büyükse sonuçlar kesimli bir şekilde döndürülür. Varsayılan olarak, sonuçlar 100 öğe veya 4 MB'lık öbekler halinde döndürülür(hangisi önce sınıra isabet edilirse). Sayfa boyutunu artırmak, gereken gidiş dönüş sayısını azaltır ve 100'den fazla öğe döndüren sorguların performansını artırır. Hangi değeri ayarlayabileceğinizden emin değilseniz, 1000 genellikle iyi bir seçimdir. Sayfa boyutu arttıkça bellek tüketimi artar, bu nedenle iş yükünüz belleğe duyarlıysa daha düşük bir değer düşünün.

eşitleme API'sinde pageSize ve byPage() zaman uyumsuz API'de iterableByPage() parametresini kullanarak bir sayfa boyutu tanımlayabilirsiniz:

//  Sync API
Iterable<FeedResponse<MyItem>> filteredItemsAsPages =
    container.queryItems(querySpec, options, MyItem.class).iterableByPage(continuationToken,pageSize);

for (FeedResponse<MyItem> page : filteredItemsAsPages) {
    for (MyItem item : page.getResults()) {
        //...
    }
}

//  Async API
Flux<FeedResponse<MyItem>> filteredItemsAsPages =
    asyncContainer.queryItems(querySpec, options, MyItem.class).byPage(continuationToken,pageSize);

filteredItemsAsPages.map(page -> {
    for (MyItem item : page.getResults()) {
        //...
    }
}).subscribe();

Arabellek boyutunu ayarlama

Paralel sorgu, geçerli sonuç toplu işlemi istemci tarafından işlenirken sonuçları önceden getirmek için tasarlanmıştır. Ön getirme, bir sorgunun genel gecikme süresi iyileştirmesine yardımcı olur. setMaxBufferedItemCount değeri CosmosQueryRequestOptions , önceden getirilen sonuçların sayısını sınırlar. Ön getirme işlemini en üst düzeye çıkarmak için değerini değerinden pageSize daha yüksek bir sayıya ayarlayın maxBufferedItemCount (NOT: Bu, yüksek bellek tüketimine de neden olabilir). Ön getirme işlemini en aza indirmek için pageSizedeğerini değerine eşit olarak ayarlayınmaxBufferedItemCount. Bu değeri 0 olarak ayarlarsanız, sistem arabelleğe alınacak öğe sayısını otomatik olarak belirler.

CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();
options.setPartitionKey(new PartitionKey("Washington"));
options.setMaxBufferedItemCount(-1);

// Define the query

//  Sync API
CosmosPagedIterable<MyItem> filteredItems = 
    container.queryItems(querySpec, options, MyItem.class);

//  Async API
CosmosPagedFlux<MyItem> filteredItems = 
    asyncContainer.queryItems(querySpec, options, MyItem.class);

Önceden getirme, paralellik derecesinden bağımsız olarak aynı şekilde çalışır ve tüm bölümlerdeki veriler için tek bir arabellek vardır.

Sonraki adımlar

Java SDK'sını kullanarak performans hakkında daha fazla bilgi edinmek için:

Sorgu Planı çağrılarını azaltma

Sorguyu yürütmek için bir sorgu planının derlenmesi gerekir. Bu genellikle Azure Cosmos DB Ağ Geçidi'ne yönelik bir ağ isteğini temsil eder ve bu da sorgu işleminin gecikme süresini artırır. Bu isteği kaldırmanın ve tek bölüm sorgu işleminin gecikme süresini azaltmanın bir yolu vardır. Tek bölüm sorguları için öğenin bölüm anahtarı değerini belirtin ve partition_key bağımsız değişkeni olarak geçirin:

items = container.query_items(
        query="SELECT * FROM r where r.city = 'Seattle'",
        partition_key="Washington"
    )

Sayfa boyutunu ayarlama

SQL sorgusu gönderdiğinizde, sonuç kümesi çok büyükse sonuçlar kesimli bir şekilde döndürülür. max_item_count, numaralandırma işleminde döndürülecek en fazla öğe sayısını ayarlamanıza olanak tanır.

items = container.query_items(
        query="SELECT * FROM r where r.city = 'Seattle'",
        partition_key="Washington",
        max_item_count=1000
    )

Sonraki adımlar

NoSQL için API için Python SDK'sını kullanma hakkında daha fazla bilgi edinmek için:

Sorgu Planı çağrılarını azaltma

Sorguyu yürütmek için bir sorgu planının derlenmesi gerekir. Bu genellikle Azure Cosmos DB Ağ Geçidi'ne yönelik bir ağ isteğini temsil eder ve bu da sorgu işleminin gecikme süresini artırır. Bu isteği kaldırmanın ve tek bölüm sorgu işleminin gecikme süresini azaltmanın bir yolu vardır. Tek bölüm sorguları için bir sorguyu tek bir bölüme kapsamlandıran iki yolla gerçekleştirilebilir.

Parametreli sorgu ifadesi kullanma ve sorgu deyiminde bölüm anahtarı belirtme. Sorgu, için program aracılığıyla oluşturulur SELECT * FROM todo t WHERE t.partitionKey = 'Bikes, Touring Bikes':

// find all items with same categoryId (partitionKey)
const querySpec = {
    query: "select * from products p where p.categoryId=@categoryId",
    parameters: [
        {
            name: "@categoryId",
            value: "Bikes, Touring Bikes"
        }
    ]
};

// Get items 
const { resources } = await container.items.query(querySpec).fetchAll();

for (const item of resources) {
    console.log(`${item.id}: ${item.name}, ${item.sku}`);
}

veya içinde FeedOptions partitionKey değerini belirtin ve bağımsız değişken olarak geçirin:

const querySpec = {
    query: "select * from products p"
};

const { resources } = await container.items.query(querySpec, { partitionKey: "Bikes, Touring Bikes" }).fetchAll();

for (const item of resources) {
    console.log(`${item.id}: ${item.name}, ${item.sku}`);
}

Sayfa boyutunu ayarlama

SQL sorgusu gönderdiğinizde, sonuç kümesi çok büyükse sonuçlar kesimli bir şekilde döndürülür. maxItemCount, numaralandırma işleminde döndürülecek en fazla öğe sayısını ayarlamanıza olanak tanır.

const querySpec = {
    query: "select * from products p where p.categoryId=@categoryId",
    parameters: [
        {
            name: "@categoryId",
            value: items[2].categoryId
        }
    ]
};

const { resources } = await container.items.query(querySpec, { maxItemCount: 1000 }).fetchAll();

for (const item of resources) {
    console.log(`${item.id}: ${item.name}, ${item.sku}`);
}

Sonraki adımlar

NoSQL için API için Node.js SDK'sını kullanma hakkında daha fazla bilgi edinmek için: