Otimizar o custo da consulta no Azure Cosmos DBOptimize query cost in Azure Cosmos DB

O Azure Cosmos DB oferece um conjunto avançado de operações de banco de dados, incluindo consultas relacionais e hierárquicas que operam nos itens de um contêiner.Azure Cosmos DB offers a rich set of database operations including relational and hierarchical queries that operate on the items within a container. O custo associado a cada uma dessas operações varia de acordo com a CPU, a e/s e a memória necessária para concluir a operação.The cost associated with each of these operations varies based on the CPU, IO, and memory required to complete the operation. Em vez de pensar e gerenciar recursos de hardware, você pode pensar em uma RU (unidade de solicitação) como uma medida única para os recursos necessários para executar várias operações de banco de dados para atender a uma solicitação.Instead of thinking about and managing hardware resources, you can think of a request unit (RU) as a single measure for the resources required to perform various database operations to serve a request. Este artigo descreve como avaliar encargos de unidade de solicitação para uma consulta e otimizar a consulta em termos de desempenho e custo.This article describes how to evaluate request unit charges for a query and optimize the query in terms of performance and cost.

As consultas em Azure Cosmos DB normalmente são ordenadas de forma mais rápida/mais eficiente para mais lenta/menos eficiente em termos de taxa de transferência da seguinte maneira:Queries in Azure Cosmos DB are typically ordered from fastest/most efficient to slower/less efficient in terms of throughput as follows:

  • Operação de obtenção em uma chave de partição única e chave de item.GET operation on a single partition key and item key.

  • Consulta com uma cláusula de filtro em uma única chave de partição.Query with a filter clause within a single partition key.

  • Consulta sem uma cláusula de filtro de igualdade ou de intervalo em qualquer propriedade.Query without an equality or range filter clause on any property.

  • Consulta sem filtros.Query without filters.

As consultas que lêem dados de uma ou mais partições incorrem em latência mais alta e consomem um número maior de unidades de solicitação.Queries that read data from one or more partitions incur higher latency and consume higher number of request units. Como cada partição tem indexação automática para todas as propriedades, a consulta pode ser servida com eficiência do índice.Since each partition has automatic indexing for all properties, the query can be served efficiently from the index. Você pode fazer consultas que usam várias partições mais rápido usando as opções de paralelismo.You can make queries that use multiple partitions faster by using the parallelism options. Para saber mais sobre particionamento e chaves de partição, confira particionamento no Azure Cosmos DB.To learn more about partitioning and partition keys, see Partitioning in Azure Cosmos DB.

Avaliar o encargo de unidade de solicitação para uma consultaEvaluate request unit charge for a query

Depois de armazenar alguns dados em seus contêineres de Cosmos do Azure, você pode usar o Data Explorer no portal do Azure para construir e executar suas consultas.Once you have stored some data in your Azure Cosmos containers, you can use the Data Explorer in the Azure portal to construct and run your queries. Você também pode obter o custo das consultas usando o data Explorer.You can also get the cost of the queries by using the data explorer. Esse método dará a você uma noção dos encargos reais envolvidos em consultas e operações típicas às quais seu sistema dá suporte.This method will give you a sense of the actual charges involved with typical queries and operations that your system supports.

Você também pode obter o custo das consultas programaticamente usando os SDKs.You can also get the cost of queries programmatically by using the SDKs. Para medir a sobrecarga de qualquer operação, como criar, atualizar ou excluir, inspecione o cabeçalho x-ms-request-charge ao usar a API REST.To measure the overhead of any operation such as create, update, or delete inspect the x-ms-request-charge header when using REST API. Se você estiver usando o .NET ou o SDK do Java, a propriedade RequestCharge será a propriedade equivalente para obter o encargo da solicitação e essa propriedade estará presente dentro de ResourceResponse ou FeedResponse.If you are using the .NET or the Java SDK, the RequestCharge property is the equivalent property to get the request charge and this property is present within the ResourceResponse or FeedResponse.

// Measure the performance (request units) of writes 
ResourceResponse<Document> response = await client.CreateDocumentAsync(collectionSelfLink, myDocument); 

Console.WriteLine("Insert of an item consumed {0} request units", response.RequestCharge); 

// Measure the performance (request units) of queries 
IDocumentQuery<dynamic> queryable = client.CreateDocumentQuery(collectionSelfLink, queryString).AsDocumentQuery(); 

while (queryable.HasMoreResults) 
     { 
          FeedResponse<dynamic> queryResponse = await queryable.ExecuteNextAsync<dynamic>(); 
          Console.WriteLine("Query batch consumed {0} request units", queryResponse.RequestCharge); 
     }

Fatores que influenciam o encargo de unidade de solicitação para uma consultaFactors influencing request unit charge for a query

As unidades de solicitação para consultas dependem de vários fatores.Request units for queries are dependent on a number of factors. Por exemplo, o número de itens do Azure Cosmos carregados/retornados, o número de pesquisas em relação ao índice, o tempo de compilação da consulta, etc. detalhes.For example, the number of Azure Cosmos items loaded/returned, the number of lookups against the index, the query compilation time etc. details. Azure Cosmos DB garante que a mesma consulta quando executada nos mesmos dados sempre consumirá o mesmo número de unidades de solicitação, mesmo com execuções repetidas.Azure Cosmos DB guarantees that the same query when executed on the same data will always consume the same number of request units even with repeat executions. O perfil de consulta usando métricas de execução de consulta fornece uma boa ideia de como as unidades de solicitação são gastas.The query profile using query execution metrics gives you a good idea of how the request units are spent.

Em alguns casos, você pode ver uma sequência de respostas de 200 e 429 e unidades de solicitação variáveis em uma execução paginada de consultas, isto é, porque as consultas serão executadas o mais rápido possível com base no RUs disponível.In some cases you may see a sequence of 200 and 429 responses, and variable request units in a paged execution of queries, that is because queries will run as fast as possible based on the available RUs. Você pode ver uma quebra de execução de consulta em várias páginas/viagens de ida e volta entre o servidor e o cliente.You may see a query execution break into multiple pages/round trips between server and client. Por exemplo, 10.000 itens podem ser retornados como várias páginas, cada um cobrado com base no cálculo realizado para essa página.For example, 10,000 items may be returned as multiple pages, each charged based on the computation performed for that page. Ao somar essas páginas, você deve obter o mesmo número de RUs que obteria para a consulta inteira.When you sum across these pages, you should get the same number of RUs as you would get for the entire query.

Métricas para solução de problemasMetrics for troubleshooting

O desempenho e a taxa de transferência consumida por consultas, UDFs (funções definidas pelo usuário) dependem principalmente do corpo da função.The performance and the throughput consumed by queries, user-defined functions (UDFs) mostly depends on the function body. A maneira mais fácil de descobrir quanto tempo a execução da consulta é gasta no UDF e o número de RUs consumidas, é habilitando as métricas de consulta.The easiest way to find out how much time the query execution is spent in the UDF and the number of RUs consumed, is by enabling the Query Metrics. Se você usar o SDK do .NET, aqui estão as métricas de consulta de exemplo retornadas pelo SDK:If you use the .NET SDK, here are sample query metrics returned by the SDK:

Retrieved Document Count                 :               1              
Retrieved Document Size                  :           9,963 bytes        
Output Document Count                    :               1              
Output Document Size                     :          10,012 bytes        
Index Utilization                        :          100.00 %            
Total Query Execution Time               :            0.48 milliseconds 
  Query Preparation Times 
    Query Compilation Time               :            0.07 milliseconds 
    Logical Plan Build Time              :            0.03 milliseconds 
    Physical Plan Build Time             :            0.05 milliseconds 
    Query Optimization Time              :            0.00 milliseconds 
  Index Lookup Time                      :            0.06 milliseconds 
  Document Load Time                     :            0.03 milliseconds 
  Runtime Execution Times 
    Query Engine Execution Time          :            0.03 milliseconds 
    System Function Execution Time       :            0.00 milliseconds 
    User-defined Function Execution Time :            0.00 milliseconds 
  Document Write Time                    :            0.00 milliseconds 
  Client Side Metrics 
    Retry Count                          :               1              
    Request Charge                       :            3.19 RUs  

Práticas recomendadas para otimizar o custo de consultasBest practices to cost optimize queries

Considere as seguintes práticas recomendadas ao otimizar consultas por custo:Consider the following best practices when optimizing queries for cost:

  • Colocar vários tipos de entidadeColocate multiple entity types

    Tente colocar vários tipos de entidade em um número único ou menor de contêineres.Try to colocate multiple entity types within a single or smaller number of containers. Esse método gera benefícios não apenas de uma perspectiva de preços, mas também para execução de consultas e transações.This method yields benefits not only from a pricing perspective, but also for query execution and transactions. As consultas estão no escopo de um único contêiner; e transações atômicas sobre vários registros por meio de procedimentos armazenados/gatilhos têm como escopo uma chave de partição em um único contêiner.Queries are scoped to a single container; and atomic transactions over multiple records via stored procedures/triggers are scoped to a partition key within a single container. A colocação de entidades no mesmo contêiner pode reduzir o número de viagens de ida e volta da rede para resolver relações entre registros.Colocating entities within the same container can reduce the number of network round trips to resolve relationships across records. Então, ele aumenta o desempenho de ponta a ponta, permite transações atômicas em vários registros para um conjunto de uma maior e, como resultado, reduz os custos.So it increases the end-to-end performance, enables atomic transactions over multiple records for a larger dataset, and as a result lowers costs. Se a colocação de vários tipos de entidade dentro de um número único ou menor de contêineres for difícil para seu cenário, geralmente porque você está migrando um aplicativo existente e não deseja fazer nenhuma alteração de código-você deve considerar o provisionamento taxa de transferência no nível do banco de dados.If colocating multiple entity types within a single or smaller number of containers is difficult for your scenario, usually because you are migrating an existing application and you do not want to make any code changes - you should then consider provisioning throughput at the database level.

  • Medir e ajustar para unidades de solicitação menores/segundo usoMeasure and tune for lower request units/second usage

    A complexidade de uma consulta afeta quantas unidades de solicitação (RUs) são consumidas para uma operação.The complexity of a query impacts how many request units (RUs) are consumed for an operation. O número de predicados, a natureza dos predicados, o número de UDFs e o tamanho do conjunto de dados de origem.The number of predicates, nature of the predicates, number of UDFs, and the size of the source data set. Todos esses fatores influenciam o custo das operações de consulta.All these factors influence the cost of query operations.

    O encargo da solicitação retornado no cabeçalho da solicitação indica o custo de uma determinada consulta.Request charge returned in the request header indicates the cost of a given query. Por exemplo, se uma consulta retornar itens de 1000 1 KB, o custo da operação será 1000.For example, if a query returns 1000 1-KB items, the cost of the operation is 1000. Como tal, dentro de um segundo, o servidor honra apenas duas solicitações desse tipo antes de limitar a taxa de solicitações subsequentes.As such, within one second, the server honors only two such requests before rate limiting subsequent requests. Para obter mais informações, consulte o artigo unidades de solicitação e a calculadora de unidade de solicitação.For more information, see request units article and the request unit calculator.

Passos seguintesNext steps

Em seguida, você pode prosseguir para saber mais sobre a otimização de custos no Azure Cosmos DB com os seguintes artigos:Next you can proceed to learn more about cost optimization in Azure Cosmos DB with the following articles: