DP-900: cómo comprender y usar índices en Azure Cosmos DB (Global Secondary Indexes)
Voy a enseñar la competencia de DP-900 sobre índices en Azure Cosmos DB — porque entender la indexación es esencial para obtener consultas rápidas y costes controlados en el servicio. Esta competencia aparece en el área de Datos no relacionales en Azure y es importante tanto para el examen como para escenarios reales de producción.
Lo que necesitas saber
La indexación en Azure Cosmos DB es el mecanismo que permite buscar documentos rápidamente sin recorrer toda la colección. Por defecto, Cosmos DB indexa todos los campos de todos los documentos (index policy por omisión), lo que hace las consultas rápidas pero puede aumentar coste y latencia de escritura. Entender cómo controlar la indexación — incluir/excluir rutas, definir tipos de índices (Hash, Range, Spatial) y niveles de precisión — permite optimizar rendimiento y coste.
Ejemplo simple: tienes documentos JSON con la estructura {"id": "1", "cliente": {"nome": "Ana", "idade": 30}, "pedido": {"valor": 120.5}}. Si haces muchas consultas por cliente.nome, debes asegurarte de que esa ruta está indexada. Si tienes campos grandes o frecuentemente actualizados que nunca se consultan (ej.: historicoCompleto), debes excluirlos de la política de indexación para reducir costes de escritura.
Cómo funciona
Conceptos clave:
- Index policy: define qué rutas se indexan y con qué tipo de índice.
- Index types: Hash (para igualdad), Range (para ordenación y rangos) y Spatial (para datos geoespaciales).
- Included / Excluded paths: especificas explícitamente qué propiedades indexar o no.
- Consistency with RU costs: indexar más rutas aumenta RU/s para operaciones de escritura; indexar menos reduce coste de escritura pero puede exigir escaneos para algunas consultas.
Ejemplo 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/*" }
]
}
La notación "/prop/?" indica indexación de propiedades escalares en esa ruta; "/prop/*" incluye objetos y arrays descendientes.
En la práctica
Paso a paso práctico para optimizar la indexación:
- Mapear patrones de consulta: lista las propiedades usadas en filtros, ordenaciones y JOINs.
- Evaluar la frecuencia de escritura: para campos altamente dinámicos, considerar excluirlos.
- Elegir tipo de índice: igualdad frecuente → Hash; ordenación/rangos → Range; geoespacial → Spatial.
- Definir included/excluded paths en la index policy de la colección/container.
- Probar con cargas representativas: medir RU/s para escritura y latencia de lectura antes y después.
Ejemplo práctico con dos queries y ajustes:
// Antes: indexación por defecto => todo indexado
SELECT * FROM c WHERE c.cliente.nome = 'Ana'
// Si añadimos ordenación por valor:
SELECT * FROM c WHERE c.cliente.nome = 'Ana' ORDER BY c.pedido.valor
// Ajuste recomendado: indexar /cliente/nome como Hash y /pedido/valor como Range para soportar ORDER BY sin scans
Notas operativas: cambiar la index policy es inmediato para nuevas escrituras; la reindexación de datos existentes puede hacerse automáticamente dependiendo del cambio, pero puede tener impacto en RU/s mientras se ejecuta.
Errores comunes
1) Confiar en el default sin verificar: aceptar la indexingPolicy por omisión puede causar RU elevados en escrituras si tienes campos grandes o muchas actualizaciones. No siempre lo predefinido es lo mejor para producción.
2) Excluir rutas demasiado amplias: usar "/*" en excludedPaths de forma indiscriminada puede impedir que consultas legítimas usen índices, forzando escaneos y aumentando RU de lectura.
3) Elegir el tipo de índice incorrecto: usar Hash cuando necesitas ordenación (ORDER BY) impedirá que la query sea servida eficientemente por el índice.
Cómo practicar
Practica con un container en Azure Cosmos DB: crea documentos de prueba que reproduzcan tu patrón de lectura/escritura, cambia la index policy y observa RU/s y latencia. Para la preparación del examen, usa el Practice Assessment OFICIAL y gratuito de Microsoft y la study guide oficial (ambos gratuitos) — estos recursos te ayudan a confirmar que entiendes el área de Datos no relacionales. No uses dumps; practica con laboratorios y los recursos oficiales.
En resumen
- La indexación en Cosmos DB acelera consultas pero aumenta coste de escritura; contrólala con index policy.
- Elige Hash para igualdad, Range para ordenación/rangos y Spatial para geoespacial.
- Incluye solo las rutas necesarias y excluye campos voluminosos/altamente actualizados para reducir RU.
- Prueba cambios con cargas reales y usa los recursos oficiales de Microsoft para practicar.