Partilhar via


Consultor de Consultas para o Cosmos DB

O Cosmos DB agora apresenta o Query Advisor, projetado para ajudá-lo a escrever consultas mais rápidas e eficientes usando a linguagem de consulta do Cosmos DB. Quer esteja a otimizar o desempenho, o custo ou a escalabilidade, o Consultor de Consultas fornece recomendações práticas para o ajudar a tirar o máximo partido dos seus dados no Azure e no Microsoft Fabric.

Por que a otimização de consultas é importante

A linguagem de consulta para o Cosmos DB (no Azure e no Fabric) é flexível, permitindo que os desenvolvedores consultem dados JSON com sintaxe familiar semelhante à SQL. À medida que os aplicativos crescem em complexidade, pequenas diferenças na estrutura de consulta podem ter um efeito significativo no desempenho e nas unidades de solicitação (RUs), especialmente em grande escala.

Por exemplo, duas consultas que retornam o mesmo resultado podem diferir drasticamente em eficiência com base em como os predicados são escritos e como os índices são aplicados.

O Query Advisor analisa suas consultas e oferece recomendações direcionadas para ajudá-lo a:

  • Reduza os custos de RU identificando expressões ineficientes ou filtros desnecessários.
  • Melhore o desempenho da consulta por meio de estruturas de consulta mais ideais.
  • Entenda o "porquê" por trás de cada sugestão, com explicações escritas em linguagem clara e amigável para desenvolvedores.

Como funciona

Quando você executa uma consulta, o Supervisor de Consultas executa seu plano de consulta, avaliando padrões que podem causar alto consumo de RU, verificações excessivas ou processamento potencialmente desnecessário. Em seguida, ele retorna um conjunto de recomendações que indicam qual parte da consulta pode estar limitando o desempenho e sugere possíveis alterações que podem ajudar.

Usando o Query Advisor

Você pode habilitar os recursos do Query Advisor definindo a PopulateQueryAdvice propriedade como QueryRequestOptionstrue. Quando não especificado, PopulateQueryAdvice o padrão é .false Para acessar o conselho, use a propriedade FeedResponse.QueryAdvicestring .

Importante

O Consultor de Consultas só funciona com o SDK do .NET para Cosmos DB. O conselho de consulta também só é devolvido na primeira viagem de ida e volta. O conselho não está disponível em chamadas de continuação subsequentes.

Considere este exemplo de consulta:

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

Aqui está um exemplo de uma solicitação SDK que executa essa consulta e usa o Supervisor de Consultas:

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

Este pedido devolve uma única declaração de aconselhamento para QA1002:

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

O conselho de consulta contém três informações importantes:

  • O ID do Aviso de Consulta: QA1002
  • A descrição do conselho: NESTE exemplo, If you are matching on a string prefix, consider using STARTSWITH.
  • O link para a documentação: Um URL para orientações detalhadas

Observação

O link para a documentação foi omitido deste exemplo.

Examples

Considere os seguintes exemplos de cenários em que você pode usar o Consultor de Consultas.

Otimizando o uso da função do sistema

Considere este exemplo onde a GetCurrentTimestamp função é usada:

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

Neste exemplo, há dois conselhos retornados pelo Consultor de Consultas: QA1008 e QA1009. Cada conselho é separado em uma nova linha na saída da cadeia de caracteres.

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

Usando este conselho, você pode reescrever a consulta para a seguinte alternativa:

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