Consultar um contêiner do Azure Cosmos DB

APLICA-SE A: NoSQL

Este artigo explica como consultar um contêiner (coleção, gráfico ou tabela) no Azure Cosmos DB. Em particular, ele aborda como as consultas entre partições e partições funcionam no Azure Cosmos DB.

Consulta na partição

Quando você consulta dados de contêineres, se a consulta tiver um filtro de chave de partição especificado, o Azure Cosmos DB otimiza automaticamente a consulta. Ele roteia a consulta para as partições físicas correspondentes aos valores de chave de partição especificados no filtro.

Por exemplo, considere a consulta abaixo com um filtro de igualdade em DeviceId. Se executarmos essa consulta em um contêiner particionado no DeviceId, essa consulta filtrará para uma única partição física.

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001'

Como no exemplo anterior, essa consulta também filtra para uma única partição. Adicionar o filtro não Location altera a seguinte consulta:

SELECT * FROM c WHERE c.DeviceId = 'XMS-0001' AND c.Location = 'Seattle'

Aqui está uma consulta que tem um filtro de intervalo na chave de partição e não terá como escopo uma única partição física. Para ser uma consulta na partição, a consulta deve ter um filtro de igualdade que inclua a chave de partição:

SELECT * FROM c WHERE c.DeviceId > 'XMS-0001'

Consulta entre partições

A consulta a seguir não tem um filtro na chave de partição (DeviceId). Portanto, ele deve se espalhar para todas as partições físicas onde é executado em relação ao índice de cada partição:

SELECT * FROM c WHERE c.Location = 'Seattle`

Cada partição física tem seu próprio índice. Portanto, quando você executa uma consulta entre partições em um contêiner, está efetivamente executando uma consulta por partição física. O Azure Cosmos DB agrega automaticamente resultados em diferentes partições físicas.

Os índices em diferentes partições físicas são independentes uns dos outros. Não há nenhum índice global no Azure Cosmos DB.

Consulta entre partições paralelas

Os SDKs do Azure Cosmos DB 1.9.0 e posteriores oferecem suporte a opções de execução de consultas paralelas. As consultas entre partições paralelas permitem-lhe realizar consultas entre partições de baixa latência.

Pode gerir a execução paralela da consulta ao otimizar os parâmetros abaixo:

  • MaxConcurrency: Define o número máximo de conexões de rede simultâneas para as partições do contêiner. Se você definir essa propriedade como -1, o SDK gerenciará o grau de paralelismo. Se o MaxConcurrency estiver definido como 0, há uma única conexão de rede com as partições do contêiner.

  • MaxBufferedItemCount: negoceia a latência da consulta em relação à utilização da memória do lado do cliente. Se essa opção for omitida ou for definida como -1, o SDK gerenciará o número de itens armazenados em buffer durante a execução da consulta paralela.

Devido à capacidade do Azure Cosmos DB de paralelizar consultas entre partições, a latência da consulta geralmente é dimensionada bem à medida que o sistema adiciona partições físicas. No entanto, a carga RU aumenta significativamente à medida que o número total de partições físicas aumenta.

Ao executar uma consulta entre partições, você está essencialmente fazendo uma consulta separada por partição física individual. Embora as consultas entre partições usem o índice, se disponíveis, elas ainda não são tão eficientes quanto as consultas na partição.

Exemplo útil

Aqui está uma analogia para explicar melhor as consultas entre partições:

Imagine que você é um motorista de entrega que tem que entregar pacotes em diferentes complexos de apartamentos. Cada complexo de apartamentos tem uma lista nas instalações que tem todos os números de unidade dos moradores. Podemos comparar cada complexo de apartamentos com uma partição física e cada lista com o índice da partição física.

Podemos comparar consultas in-partition e cross-partition usando este exemplo:

Consulta na partição (exemplo)

Se o motorista de entrega conhece o complexo de apartamentos correto (divisória física), então eles podem dirigir imediatamente para o prédio correto. O motorista pode verificar a lista do complexo de apartamentos dos números de unidade dos moradores (o índice) e entregar rapidamente os pacotes apropriados. Neste caso, o motorista não perde tempo ou esforço dirigindo-se a um complexo de apartamentos para verificar e ver se algum destinatário do pacote mora lá.

Consulta entre partições (fan-out)

Se o entregador não souber o complexo de apartamentos correto (divisória física), ele precisa dirigir até cada prédio de apartamentos e verificar a lista com todos os números de unidade dos moradores (o índice). Assim que o motorista chega a cada condomínio, ele ainda pode usar a lista dos endereços de cada morador. No entanto, eles precisam verificar a lista de todos os complexos de apartamentos, se algum destinatário do pacote mora lá ou não. Este exemplo é como as consultas entre partições funcionam. Embora eles possam usar o índice (ou seja, eles não precisam bater em todas as portas), eles devem verificar separadamente o índice para cada partição física.

Consulta entre partições (com escopo para apenas algumas partições físicas)

Se o motorista de entrega sabe que todos os destinatários do pacote vivem dentro de um determinado pequeno complexo de apartamentos, ele não precisa dirigir para cada um. Embora dirigir para alguns complexos de apartamentos ainda exija mais trabalho do que visitar apenas um único prédio, o motorista de entrega ainda economiza tempo e esforço significativos. Se uma consulta tiver a chave de partição em seu filtro com a IN palavra-chave, ela verificará apenas os índices de dados da partição física relevante.

Evite consultas entre partições

Para a maioria dos contêineres, ter algumas consultas entre partições é inevitável, o que é bom! Quase todas as operações de consulta são suportadas entre partições, tanto para chaves de partição lógicas como para partições físicas. O Azure Cosmos DB também tem muitas otimizações no mecanismo de consulta e SDKs de cliente para paralelizar a execução de consultas em partições físicas.

Para a maioria dos cenários de leitura pesada, recomendamos selecionar a propriedade mais comum em seus filtros de consulta. Você também deve certificar-se de que sua chave de partição adere a outras práticas recomendadas de seleção de chave de partição.

Evitar consultas entre partições normalmente só é importante com contêineres grandes. É cobrado um mínimo de cerca de 2,5 RU's cada vez que verifica os resultados do índice de uma partição física, mesmo que nenhum item na partição física corresponda ao filtro da consulta. Como tal, se você tiver apenas uma (ou apenas algumas) partições físicas, as consultas entre partições não consomem significativamente mais RUs do que as consultas na partição.

O número de partições físicas está vinculado à quantidade de RU provisionadas. Cada partição física permite até 10.000 RU provisionados e pode armazenar até 50 GB de dados. O Azure Cosmos DB gerencia automaticamente partições físicas para você. O número de partições físicas em seu contêiner depende da taxa de transferência provisionada e do armazenamento consumido.

Você deve tentar evitar consultas entre partições se sua carga de trabalho atender aos seguintes critérios:

  • Você planeja ter mais de 30.000 RU provisionados
  • Você planeja armazenar mais de 100 GB de dados

Próximos passos

Consulte os seguintes artigos para saber mais sobre particionamento no Azure Cosmos DB: