Aracılığıyla paylaş


Cosmos DB için Sorgu Danışmanı

Cosmos DB artık Cosmos DB sorgu dilini kullanarak daha hızlı ve daha verimli sorgular yazmanıza yardımcı olmak için tasarlanmış Sorgu Danışmanı'na sahiptir. Performans, maliyet veya ölçeklenebilirlik için iyileştirmeler yapmanız fark etmeksizin Sorgu Danışmanı, Azure ve Microsoft Fabric genelinde verilerinizden en iyi şekilde yararlanmak için eyleme dönüştürülebilir öneriler sağlar.

Sorgu iyileştirme neden önemlidir?

Cosmos DB'nin sorgu dili (Azure ve Doku'da) esnektir ve geliştiricilerin JSON verilerini tanıdık SQL benzeri söz dizimiyle sorgulamasına olanak tanır. Uygulamaların karmaşıklığı arttıkça, sorgu yapısındaki küçük farklılıklar özellikle büyük ölçekte performans ve istek birimleri (RU) üzerinde önemli bir etkiye sahip olabilir.

Örneğin, aynı sonucu döndüren iki sorgu, önkoşulların nasıl yazıldığını ve dizinlerin nasıl uygulandığını temel alarak verimlilik açısından önemli ölçüde farklılık gösterebilir.

Sorgu Danışmanı sorgularınızı analiz eder ve size yardımcı olmak için hedeflenen öneriler sunar:

  • Verimsiz ifadeleri veya gereksiz filtreleri belirleyerek RU maliyetlerini azaltın.
  • Daha uygun sorgu yapıları aracılığıyla sorgu performansını geliştirin.
  • Açık ve geliştirici dostu bir dilde yazılmış açıklamalarla her önerinin arkasındaki "nedenini" anlayın.

Nasıl çalışır?

Sorgu yürüttüğünüzde, Sorgu Danışmanı sorgu planınız üzerinde çalışır ve yüksek RU tüketimine, aşırı taramalara veya potansiyel olarak gereksiz işlemeye neden olabilecek desenleri değerlendirir. Ardından, sorgunun hangi bölümünün performansı sınırlayabileceğini belirten bir öneri kümesi döndürür ve yardımcı olabilecek olası değişiklikler önerir.

Sorgu Danışmanı'nın kullanımı

içindeki özelliğini QueryRequestOptionstrueolarak ayarlayarak PopulateQueryAdvice Sorgu Danışmanı özelliklerini etkinleştirebilirsiniz. Belirtilmediğinde, PopulateQueryAdvice varsayılan olarak olarak falsegösterilir. Öneriye erişmek için dize özelliğini FeedResponse.QueryAdvicekullanın.

Önemli

Sorgu Danışmanı yalnızca Cosmos DB için .NET SDK'sı ile çalışır. Sorgu önerisi de yalnızca ilk gidiş dönüşte döndürülür. Öneri, sonraki devamlılık çağrılarında kullanılamaz.

Şu örnek sorguyu göz önünde bulundurun:

SELECT VALUE
    r.id
FROM
    root r
WHERE
    CONTAINS(r.name, 'Abc')

Bu sorguyu gerçekleştiren ve Sorgu Danışmanı'nın kullanıldığı bir SDK isteği örneği aşağıda verilmiştir:

using Microsoft.Azure.Cosmos;

CosmosClient client = new("<connection-string>");
Container container = client.GetContainer("<database-name>", "<container-name>");

string query = """
SELECT VALUE
    r.id
FROM
    root r
WHERE
    CONTAINS(r.name, 'Abc')
""";

QueryRequestOptions requestOptions = new()
{
    PopulateQueryAdvice = true
};

using FeedIterator<dynamic> itemQuery = container.GetItemQueryIterator<dynamic>(
    query,
    requestOptions: requestOptions);

string? queryAdvice = null;
while (itemQuery.HasMoreResults)
{
    if (queryAdvice is not null)
    {
        break;
    }

    FeedResponse<dynamic> page = await itemQuery.ReadNextAsync();
    queryAdvice = page.QueryAdvice;
}

Console.WriteLine(queryAdvice);

Bu istek için QA1002tek bir öneri deyimi döndürür:

QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]

Sorgu önerisi üç önemli bilgi içerir:

  • Sorgu Önerisi Kimliği: QA1002
  • Öneri açıklaması: Bu örnekte, If you are matching on a string prefix, consider using STARTSWITH.
  • Belgelerin bağlantısı: Ayrıntılı kılavuzun URL'si

Uyarı

Bu örnekte belgelerin bağlantısı atlanmıştır.

Örnekler

Sorgu Danışmanı'nı kullanabileceğiniz senaryoların aşağıdaki örneklerini göz önünde bulundurun.

Sistem işlevi kullanımını iyileştirme

İşlevin GetCurrentTimestamp kullanıldığı bu örneği göz önünde bulundurun:

SELECT
    GetCurrentTicks() 
FROM
    container c
WHERE
    GetCurrentTimestamp() > 10

Bu örnekte, Sorgu Danışmanı tarafından döndürülen iki öneri vardır: QA1008 ve QA1009. Her öneri parçası, dize çıkışında yeni bir satıra ayrılır.

QA1009: Consider using GetCurrentTimestampStatic instead of GetCurrentTimestamp in the WHERE clause. [...]
QA1008: Consider using GetCurrentTicksStatic instead of GetCurrentTicks in the WHERE clause. [...]

Bu öneriyi kullanarak sorguyu aşağıdaki alternatife yeniden yazabilirsiniz:

SELECT
    GetCurrentTicksStatic() 
FROM
    container c
WHERE
    GetCurrentTimestampStatic() > 10