Bagikan melalui


Query Advisor untuk Cosmos DB

Cosmos DB sekarang menampilkan Query Advisor, yang dirancang untuk membantu Anda menulis kueri yang lebih cepat dan lebih efisien menggunakan bahasa kueri Cosmos DB. Baik Anda mengoptimalkan performa, biaya, atau skalabilitas, Query Advisor memberikan rekomendasi yang dapat ditindaklanjuti untuk membantu Anda memaksimalkan data Anda di Azure dan Microsoft Fabric.

Mengapa pengoptimalan kueri penting

Bahasa kueri untuk Cosmos DB (di Azure dan Fabric) fleksibel, memungkinkan pengembang untuk mengkueri data JSON dengan sintaks seperti SQL yang sudah dikenal. Ketika aplikasi tumbuh dalam kompleksitas, perbedaan kecil dalam struktur kueri dapat memiliki efek yang signifikan pada performa dan unit permintaan (RU), terutama dalam skala besar.

Misalnya, dua kueri yang mengembalikan hasil yang sama dapat berbeda secara dramatis dalam efisiensi berdasarkan bagaimana predikat ditulis dan bagaimana indeks diterapkan.

Query Advisor menganalisis kueri Anda dan menawarkan rekomendasi yang ditargetkan untuk membantu Anda:

  • Kurangi biaya RU dengan mengidentifikasi ekspresi yang tidak efisien atau filter yang tidak perlu.
  • Meningkatkan performa kueri melalui struktur kueri yang lebih optimal.
  • Pahami "mengapa" di balik setiap saran, dengan penjelasan yang ditulis dalam bahasa yang jelas dan ramah pengembang.

Cara kerjanya

Saat Anda menjalankan kueri, Query Advisor menjalankan rencana kueri Anda, mengevaluasi pola yang dapat menyebabkan konsumsi RU tinggi, pemindaian berlebihan, atau pemrosesan yang berpotensi tidak perlu. Kemudian mengembalikan serangkaian rekomendasi yang menunjukkan bagian mana dari kueri yang dapat membatasi performa, dan menyarankan potensi perubahan yang dapat membantu.

Menggunakan Query Advisor

Anda dapat mengaktifkan kemampuan Query Advisor dengan mengatur properti ke PopulateQueryAdviceQueryRequestOptionstrue. Ketika tidak ditentukan, PopulateQueryAdvice default ke false. Untuk mengakses saran, gunakan properti FeedResponse.QueryAdvicestring .

Penting

Query Advisor hanya berfungsi dengan .NET SDK untuk Cosmos DB. Saran kueri juga hanya dikembalikan pada perjalanan pulang pergi pertama. Saran tidak tersedia pada panggilan kelanjutan berikutnya.

Pertimbangkan kueri contoh ini:

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

Berikut adalah contoh permintaan SDK yang melakukan kueri ini dan menggunakan Query Advisor:

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);

Permintaan ini mengembalikan satu pernyataan saran untuk QA1002:

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

Saran kueri berisi tiga informasi penting:

  • ID Saran Kueri: QA1002
  • Deskripsi saran: DALAM contoh ini, If you are matching on a string prefix, consider using STARTSWITH.
  • Tautan ke dokumentasi: URL ke panduan terperinci

Nota

Tautan ke dokumentasi dihilangkan dari contoh ini.

Examples

Pertimbangkan contoh skenario berikut di mana Anda bisa menggunakan Query Advisor.

Mengoptimalkan penggunaan fungsi sistem

Pertimbangkan contoh ini di GetCurrentTimestamp mana fungsi digunakan:

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

Dalam contoh ini, ada dua saran yang dikembalikan oleh Query Advisor: QA1008 dan QA1009. Setiap saran dipisahkan menjadi baris baru dalam output string.

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

Dengan menggunakan saran ini, Anda dapat menulis ulang kueri ke alternatif berikut:

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