Otimizar o custo de pedido no Azure Cosmos DB
APLICA-SE A: NoSQL MongoDB Cassandra Gremlin Tabela
Este artigo descreve como as solicitações de leitura e gravação se traduzem em Unidades de Solicitação e como otimizar o custo dessas solicitações. As operações de leitura incluem leituras pontuais e consultas. As operações de gravação incluem inserção, substituição, exclusão e atualização de itens.
O Azure Cosmos DB oferece um conjunto avançado de operações de banco de dados que operam nos itens dentro de um contêiner. O custo associado a cada uma destas operações varia com base na CPU, E/S e memória necessárias para concluir a operação. Em vez de pensar e gerenciar recursos de hardware, você pode pensar em uma Unidade de Solicitação (RU) como uma única medida para os recursos necessários para executar várias operações de banco de dados para atender a uma solicitação.
Medição da taxa de RU de um pedido
É importante medir a cobrança de RU de suas solicitações para entender seu custo real e também avaliar a eficácia de suas otimizações. Você pode obter esse custo usando o portal do Azure ou inspecionando a resposta enviada de volta do Azure Cosmos DB por meio de um dos SDKs. Consulte Localizar a taxa de unidade de solicitação no Azure Cosmos DB para obter instruções detalhadas sobre como conseguir isso.
Leitura de dados: leituras pontuais e consultas
As operações de leitura no Azure Cosmos DB normalmente são ordenadas da mais rápida/mais eficiente para a mais lenta/menos eficiente em termos de consumo de RU da seguinte maneira:
- Leituras de pontos (pesquisa de chave/valor em um único ID de item e chave de partição).
- Consulta com uma cláusula de filtro dentro de uma única chave de partição.
- Consulta sem uma cláusula de filtro de igualdade ou intervalo em qualquer propriedade.
- Consulta sem filtros.
Papel do nível de coerência
Ao usar os níveis de consistência de obsoletos fortes ou limitados, o custo de RU de qualquer operação de leitura (leitura pontual ou consulta) é dobrado.
Ponto lê
O único fator que afeta a carga de RU de uma leitura pontual (além do nível de consistência usado) é o tamanho do item recuperado. A tabela a seguir mostra o custo RU de leituras de pontos para itens com 1 KB e 100 KB de tamanho.
Tamanho do item | Custo de um ponto lido |
---|---|
1 KB | 1 RU |
100 KB | 10 RUs |
Como as leituras de ponto (pesquisas de chave/valor no ID do item e na chave de partição) são o tipo de leitura mais eficiente, você deve certificar-se de que o ID do item tenha um valor significativo para que possa buscar seus itens com uma leitura pontual (em vez de uma consulta) quando possível.
Nota
Na API para NoSQL, as leituras pontuais só podem ser feitas usando a API REST ou SDKs. As consultas que filtram o ID e a chave de partição de um item não são consideradas uma leitura pontual. Para ver um exemplo usando o SDK do .NET, consulte ler um item no Azure Cosmos DB para NoSQL.
Consultas
As unidades de solicitação para consultas dependem de vários fatores. Por exemplo, o número de itens do Azure Cosmos DB carregados/retornados, o número de pesquisas em relação ao índice, o tempo de compilação da consulta, etc. detalhes. O 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. O perfil de consulta usando métricas de execução de consulta dá uma boa ideia de como as unidades de solicitação são gastas.
Em alguns casos, você pode ver uma sequência de 200 e 429 respostas e unidades de solicitação variáveis em uma execução paginada de consultas, isso porque as consultas serão executadas o mais rápido possível com base nas RUs disponíveis. Você pode ver uma divisão de execução de consulta em várias páginas/viagens de ida e volta entre o servidor e o cliente. 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. Ao somar essas páginas, você deve obter o mesmo número de RUs que obteria para toda a consulta.
Métricas para solução de problemas de consultas
O desempenho e a taxa de transferência consumidos por consultas (incluindo funções definidas pelo usuário) dependem principalmente do corpo da função. A maneira mais fácil de descobrir quanto tempo a execução da consulta é gasta no UDF e o número de RUs consumidos é habilitando as métricas de consulta. Se você usar o SDK do .NET, aqui estão exemplos de métricas de consulta retornadas pelo 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 das consultas
Considere as seguintes práticas recomendadas ao otimizar consultas para custo:
Colocalizar vários tipos de entidade
Tente colocalizar vários tipos de entidade dentro de um único ou menor número de contêineres. Esse método produz benefícios não apenas de uma perspetiva de preços, mas também para a execução de consultas e transações. As consultas têm como escopo um único contêiner; e as transações atômicas em vários registros por meio de procedimentos/gatilhos armazenados têm como escopo uma chave de partição dentro de um único contêiner. A colocalização de entidades dentro do mesmo contêiner pode reduzir o número de viagens de ida e volta da rede para resolver relacionamentos entre registros. Assim, ele aumenta o desempenho de ponta a ponta, permite transações atômicas em vários registros para um conjunto de dados maior e, como resultado, reduz os custos. Se a colocação de vários tipos de entidade em um único ou menor número de contêineres for difícil para o cenário, geralmente porque você está migrando um aplicativo existente e não deseja fazer alterações de código - considere provisionar a taxa de transferência no nível do banco de dados.
Meça e ajuste para unidades de solicitação mais baixas/segundo de uso
A complexidade de uma consulta afeta quantas unidades de solicitação (RUs) são consumidas para uma operação. O número de predicados, a natureza dos predicados, o número de UDFs e o tamanho do conjunto de dados de origem. Todos esses fatores influenciam o custo das operações de consulta.
O Azure Cosmos DB fornece desempenho previsível em termos de taxa de transferência e latência usando um modelo de taxa de transferência provisionada. A taxa de transferência provisionada é representada em termos de Unidades de Solicitação por segundo ou RU/s. Uma Unidade de Solicitação (RU) é uma abstração lógica sobre recursos de computação como CPU, memória, E/S, etc., que são necessários para executar uma solicitação. A taxa de transferência provisionada (RUs) é reservada e dedicada ao seu contêiner ou banco de dados para fornecer taxa de transferência e latência previsíveis. A taxa de transferência provisionada permite que o Azure Cosmos DB forneça desempenho previsível e consistente, baixa latência garantida e alta disponibilidade em qualquer escala. As unidades de solicitação representam a moeda normalizada que simplifica o raciocínio sobre quantos recursos um aplicativo precisa.
A taxa de solicitação retornada no cabeçalho da solicitação indica o custo de uma determinada consulta. Por exemplo, se uma consulta retorna 1000 itens de 1 KB, o custo da operação é 1000. Como tal, dentro de um segundo, o servidor honra apenas duas dessas solicitações antes de limitar as solicitações subsequentes. Para obter mais informações, consulte o artigo unidades de solicitação e a calculadora de unidades de solicitação.
Gravando dados
O custo de RU para escrever um item depende:
- O tamanho do item.
- O número de propriedades cobertas pela política de indexação e que precisavam ser indexadas.
Inserir um item de 1 KB sem indexação custa cerca de ~5,5 RUs. A substituição de um item custa duas vezes a taxa necessária para inserir o mesmo item.
Otimizando gravações
A melhor maneira de otimizar o custo de RU das operações de gravação é dimensionar corretamente seus itens e o número de propriedades que são indexadas.
- O armazenamento de itens muito grandes no Azure Cosmos DB resulta em altas taxas de RU e pode ser considerado um antipadrão. Em particular, não armazene conteúdo binário ou grandes pedaços de texto que você não precisa consultar. Uma prática recomendada é colocar esse tipo de dados no Armazenamento de Blobs do Azure e armazenar uma referência (ou link) ao blob no item que você escreve no Azure Cosmos DB.
- Otimizar sua política de indexação para indexar apenas as propriedades nas quais suas consultas filtram pode fazer uma enorme diferença nas RUs consumidas por suas operações de gravação. Ao criar um novo contêiner, a política de indexação padrão indexa cada propriedade encontrada em seus itens. Embora esse seja um bom padrão para atividades de desenvolvimento, é altamente recomendável reavaliar e personalizar sua política de indexação ao ir para a produção ou quando sua carga de trabalho começar a receber tráfego significativo.
Ao executar a ingestão em massa de dados, também é recomendável usar a biblioteca de executores em massa do Azure Cosmos DB, pois ela foi projetada para otimizar o consumo de RU dessas operações. Opcionalmente, você também pode usar o Azure Data Factory , que é criado nessa mesma biblioteca.
Próximos passos
Em seguida, você pode continuar para saber mais sobre otimização de custos no Azure Cosmos DB com os seguintes artigos:
- Saiba mais sobre Otimização para desenvolvimento e teste
- Saiba mais sobre como Compreender a fatura do Azure Cosmos DB
- Saiba mais sobre como Otimizar o custo do débito
- Saiba mais sobre como Otimizar o custo do armazenamento
- Saiba mais sobre como otimizar o custo de contas do Azure Cosmos DB de várias regiões
- Saiba mais sobre a capacidade reservada do Azure Cosmos DB
- Tentando fazer o planejamento de capacidade para uma migração para o Azure Cosmos DB? Você pode usar informações sobre seu cluster de banco de dados existente para planejamento de capacidade.
- Se tudo o que você sabe é o número de vcores e servidores em seu cluster de banco de dados existente, leia sobre como estimar unidades de solicitação usando vCores ou vCPUs
- Se você souber as taxas de solicitação típicas para sua carga de trabalho de banco de dados atual, leia sobre como estimar unidades de solicitação usando o planejador de capacidade do Azure Cosmos DB