DP-900: como compreender e usar índices em Azure Cosmos DB (Global Secondary Indexes)
Vou ensinar a competência de DP-900 sobre índices em Azure Cosmos DB — porque perceber a indexação é essencial para obter consultas rápidas e custos controlados no serviço. Esta competência aparece na área de Dados não relacionais no Azure e é importante tanto para o exame como para cenários reais de produção.
O que precisas de saber
Indexação em Azure Cosmos DB é o mecanismo que permite procurar documentos rapidamente sem varrer toda a coleção. Por defeito, Cosmos DB indexa todos os campos de todos os documentos (index policy por omissão), o que torna as consultas rápidas mas pode aumentar custo e latência de escrita. Perceber como controlar a indexação — incluir/excluir caminhos, definir tipos de índices (Hash, Range, Spatial) e níveis de precisão — permite optimizar desempenho e custo.
Exemplo simples: tens documentos JSON com a estrutura {"id": "1", "cliente": {"nome": "Ana", "idade": 30}, "pedido": {"valor": 120.5}}. Se fazes muitas consultas por cliente.nome, deves garantir que esse caminho está indexado. Se tens campos grandes ou frequentemente actualizados que nunca são consultados (ex.: historicoCompleto), deves excluí‑los da política de indexação para reduzir custos de escrita.
Como funciona
Conceitos-chave:
- Index policy: define quais caminhos são indexados e com que tipo de índice.
- Index types: Hash (para igualdade), Range (para ordenação e intervalos) e Spatial (para dados geoespaciais).
- Included / Excluded paths: especificas explicitamente quais propriedades indexar ou não.
- Consistency with RU costs: indexar mais caminhos aumenta RU/s para operações de escrita; indexar menos reduz custo de escrita mas pode exigir scans para algumas consultas.
Exemplo de index policy (JSON simplificado):
{
"indexingMode": "consistent",
"automatic": true,
"includedPaths": [
{ "path": "/cliente/nome/?", "indexes": [ {"kind":"Hash","dataType":"String","precision":3} ] },
{ "path": "/pedido/valor/?", "indexes": [ {"kind":"Range","dataType":"Number"} ] }
],
"excludedPaths": [
{ "path": "/historicoCompleto/*" }
]
}
A notação "/prop/?" indica indexação de propriedades escalares naquela rota; "/prop/*" inclui objectos e arrays descendentes.
Na prática
Passo a passo prático para optimizar indexação:
- Mapear padrões de consulta: lista as propriedades usadas em filtros, ordenações e JOINs.
- Avaliar a frequência de escrita: para campos altamente dinâmicos, considerar excluí‑los.
- Escolher tipo de índice: igualdade frequente → Hash; ordenação/intervalos → Range; geoespacial → Spatial.
- Definir included/excluded paths na index policy da coleção/container.
- Testar com workloads representativos: medir RU/s para escrita e latência de leitura antes e depois.
Exemplo prático com duas queries e ajustes:
// Antes: indexação por defeito => tudo indexado
SELECT * FROM c WHERE c.cliente.nome = 'Ana'
// Se adicionarmos ordenação por valor:
SELECT * FROM c WHERE c.cliente.nome = 'Ana' ORDER BY c.pedido.valor
// Ajuste recomendado: indexar /cliente/nome como Hash e /pedido/valor como Range para suportar ORDER BY sem scans
Notas operacionais: mudar a index policy é imediato para novas escritas; a reindexação de dados existentes pode ser feita automaticamente dependendo da alteração, mas pode ter impacto em RU/s enquanto decorre.
Erros comuns
1) Confiar no default sem verificar: aceitar a indexingPolicy por omissão pode causar RU elevados em escritas se tens campos grandes ou muitas actualizações. Nem sempre o predefinido é o melhor para produção.
2) Excluir caminhos demasiado amplos: usar "/*" em excludedPaths de forma indiscriminada pode impedir que consultas legítimas usem índices, forçando scans e aumentando RU de leitura.
3) Escolher o tipo de índice errado: usar Hash quando precisas de ordenação (ORDER BY) vai impedir que a query seja servida eficientemente pelo índice.
Como praticar
Pratica com um container no Azure Cosmos DB: cria documentos de teste que reproduzam o teu padrão de leitura/escrita, altera a index policy e observa RU/s e latência. Para preparação do exame, usa o Practice Assessment OFICIAL e gratuito da Microsoft e a study guide oficial (ambos gratuitos) — estes recursos ajudam‑te a confirmar que entendes a área de Dados não relacionais. Não uses dumps; pratica com laboratórios e os recursos oficiais.
Em resumo
- Indexação em Cosmos DB acelera consultas mas aumenta custo de escrita; controla‑a com index policy.
- Escolhe Hash para igualdade, Range para ordenação/intervalos e Spatial para geoespacial.
- Inclui apenas os caminhos necessários e exclui campos volumosos/altamente actualizados para reduzir RU.
- Testa alterações com cargas reais e usa os recursos oficiais da Microsoft para praticar.