Optimizar la indexación, el costo vectorial y la coherencia en Azure Cosmos DB
Volver a la ruta AI-200
AI-200Capítulo 11

Preparación para la Certificación Microsoft AI-200

Optimizar la indexación, el costo vectorial y la coherencia en Azure Cosmos DB

Convierte patrones reales de consulta en índices selectivos de intervalo, compuestos, de tupla y vectoriales, mide la eficiencia de RU y elige garantías de coherencia sin costos innecesarios.

Tiempo de estudio sugerido: 115 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio guiado de rendimiento

Escudo neón Microsoft Certified AI-200 con indexación de Azure Cosmos DB, búsqueda vectorial, optimización de RU y coherencia

1. Diagnosticar la búsqueda en producción antes de agregar índices

Una plataforma de búsqueda semántica puede funcionar con pocos datos y fallar al llegar a producción. Imagina millones de elementos con , texto extraído y embeddings generados por . Los usuarios combinan palabras clave, intervalos de fechas, tipos y clasificación semántica, y esperan respuestas inferiores a 100 milisegundos. A escala real aumenta la latencia, se disparan las RU y las cargas recientes no siempre aparecen de inmediato.

Las causas se relacionan: la directiva predeterminada crea índices de intervalo para todas las propiedades, incluso grandes matrices de embeddings; faltan índices compuestos y algunas consultas examinan el contenedor; además, la coherencia eventual no garantiza que el autor lea inmediatamente su propia escritura. La solución parte del inventario de consultas, sus métricas y el requisito de actualización del usuario.

  • Localizar filtros, ordenaciones y consultas vectoriales lentas.
  • Configurar índices de intervalo y compuestos según el acceso real.
  • Elegir flat, quantizedFlat o DiskANN según volumen y calidad.
  • Equilibrar mejoras de lectura con costo de escritura, almacenamiento y transformación.
  • Seleccionar la coherencia necesaria sin pagar por garantías superfluas.

Resumen del tema

La optimización comienza con evidencias de consulta y requisitos de actualización, no con la creación indiscriminada de índices.

2. Comprender la indexación automática, las familias y los modos

Un contenedor nuevo de for indexa automáticamente todas las propiedades mediante índices de intervalo. Esto simplifica el desarrollo inicial porque casi cualquier filtro escalar dispone de un índice, pero cada ruta ocupa almacenamiento y añade trabajo sincrónico a las escrituras. Las cargas de IA con acceso predecible suelen beneficiarse de una directiva selectiva.

Familias de índices y patrones atendidos.
FamiliaUso principal
IntervaloIgualdad, comparación, ORDER BY de una propiedad, funciones de cadena e IS_DEFINED.
CompuestoORDER BY de varias propiedades y combinaciones frecuentes de igualdad e intervalo.
EspacialST_DISTANCE, ST_WITHIN y ST_INTERSECTS para información geográfica.
VectorialSimilitud de embeddings mediante VectorDistance.
TuplaVarios campos pertenecientes al mismo elemento de una matriz.
Texto completoBúsqueda textual tratada en otro capítulo de AI-200.

El modo coherente actualiza los índices durante la escritura y es la opción habitual cuando los datos recién ingeridos deben ser consultables. None deshabilita los índices secundarios y sirve para lecturas puntuales por id y clave de partición o cargas masivas específicas. La indexación diferida está en desuso para contenedores nuevos; los usos existentes deben migrar al modo coherente.

Resumen del tema

La directiva automática maximiza la cobertura; una directiva coherente personalizada evita almacenamiento y escritura sin utilidad.

3. Controlar rutas incluidas, excluidas y propiedades del sistema

Las expresiones de ruta deciden qué entra en el índice. /* incluye recursivamente valores escalares desde la raíz, /property/? selecciona un escalar, /array/[] cubre los elementos de una matriz y /nested/path/* cubre descendientes. Cuando hay conflicto, gana la ruta más específica, de modo que es posible excluir ampliamente y volver a incluir solo lo necesario.

  • id y _ts siempre permanecen indexados en modo coherente.
  • _etag se excluye de forma predeterminada y rara vez necesita un índice.
  • Si la clave de partición no es /id, no se indexa automáticamente como intervalo; inclúyela cuando aparezca en filtros.
  • Excluye texto extenso solo mostrado, binarios, sin consultar y matrices de embeddings.
{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    { "path": "/tenantId/?" },
    { "path": "/documentType/?" },
    { "path": "/category/?" },
    { "path": "/uploadDate/?" }
  ],
  "excludedPaths": [
    { "path": "/*" },
    { "path": "/embedding/*" }
  ],
  "compositeIndexes": [[
    { "path": "/documentType", "order": "ascending" },
    { "path": "/uploadDate", "order": "descending" }
  ]],
  "vectorIndexes": [
    { "path": "/embedding", "type": "diskANN" }
  ]
}
Directiva selectiva de Azure Cosmos DB envía metadatos a índices de intervalo y compuestos y embeddings a un índice vectorial.
Una sola directiva coordina acceso escalar, compuesto y vectorial sin indexar cargas que nunca se consultan.

Resumen del tema

Con exclusión predeterminada, incluye expresamente la clave de partición y cada propiedad usada por las consultas.

4. Diseñar índices de intervalo para filtros y funciones de texto

Los índices de intervalo admiten =, !=, >, <, >= y <=, además de ordenar por una propiedad. También sirven a CONTAINS, STARTSWITH, ENDSWITH, StringEquals e IS_DEFINED cuando la propiedad indexada ocupa la posición compatible. Una consulta por documentType y uploadDate necesita ambas rutas; de lo contrario, las RU aumentan con los datos examinados y no con los resultados.

Son la base para tipo, estado, categoría, fechas, puntuaciones y umbrales. No sustituyen un índice de texto completo para recuperación lingüística y no deben aplicarse a embeddings solo porque contienen números.

Resumen del tema

Usa índices de intervalo para escalares, comparaciones y ordenación simple; reserva los embeddings al índice vectorial.

5. Hacer coincidir índices compuestos con ORDER BY y varios filtros

Una ordenación por dos o más propiedades necesita un índice compuesto con la misma secuencia y dirección. Un índice relevanceScore DESC y uploadDate DESC también admite la inversión completa a ASC, pero no direcciones mezcladas. Cambiar la secuencia define otro índice.

Al filtrar por documentType y ordenar por uploadDate, repetir la propiedad de igualdad en ORDER BY permite que un índice compuesto resuelva el prefijo fijo y el sufijo ordenado.

SELECT * FROM c
WHERE c.documentType = 'pdf'
ORDER BY c.documentType ASC, c.uploadDate DESC

Con varios filtros, coloca primero las igualdades y al final una sola condición de intervalo. Si existen dos intervalos, el motor puede combinar dos índices compuestos que comparten los campos de igualdad y terminan en intervalos distintos. Prioriza las combinaciones frecuentes y voluminosas, no casos excepcionales.

Resumen del tema

Los índices compuestos dependen del orden: igualdades al inicio, un intervalo al final y una ordenación que coincida con la definición.

6. Aplicar índices de tupla y transformar directivas con seguridad

Un índice de tupla mantiene relacionados los campos del mismo elemento de una matriz. Resulta adecuado para fragmentos con posición y , etiquetas con categoría y peso o eventos con fecha y tipo. Sin esta semántica, el motor no representa eficazmente que todas las condiciones deben cumplirse en el mismo miembro.

{
  "includedPaths": [
    { "path": "/*" },
    { "path": "/chunks/[]/{position, tokens}/?" }
  ]
}

Cada índice eleva la latencia y las RU de escritura porque el modo coherente lo mantiene sincrónicamente. Los cambios ejecutan una transformación asincrónica. Un índice nuevo solo ayuda al terminar; uno eliminado deja de servir consultas inmediatamente. Para reemplazar, agrega la definición nueva, espera y verifica el 100% y después quita la anterior. Supervisa el progreso en Portal o mediante superficies compatibles del y programa cambios grandes fuera de las horas punta.

Resumen del tema

Los índices de tupla resuelven filtros dentro del mismo elemento; el reemplazo seguro es agregar, esperar, verificar y eliminar.

7. Seleccionar el índice vectorial para el ámbito buscado

Los índices vectoriales aceleran VectorDistance y los índices de intervalo o compuestos atienden los . La directiva vectorial del contenedor define ruta, tipo, dimensiones y función de distancia; la directiva de indexación asigna flat, quantizedFlat o diskANN.

Guía para índices vectoriales.
TipoComportamiento y límiteÁmbito típico
flat exacta; máximo 505 dimensiones.Pocos candidatos o necesidad de recuperación del 100%.
quantizedFlatVectores comprimidos recorridos por ; máximo 4.096 dimensiones y pequeña posible pérdida de recuperación.Aproximadamente 1.000 a 50.000 vectores por partición física o búsqueda muy filtrada.
diskANNVecinos aproximados con algoritmos de Microsoft Research; máximo 4.096 dimensiones.Más de unos 50.000 vectores por partición física, baja latencia y eficiencia de RU.

quantizedFlat y diskANN necesitan al menos 1.000 vectores para que su estructura optimizada sea efectiva; por debajo se ejecuta un examen completo. Una aplicación creciente puede comenzar con flat y migrar tras pruebas representativas. Excluye siempre los embeddings de la indexación de intervalo.

Flujo de decisión compara flat, quantizedFlat y DiskANN por cantidad de vectores, recuperación, latencia y RU.
Importa más el número de candidatos después de la partición y los filtros que el tamaño total de la cuenta.

Resumen del tema

Elige por cantidad de candidatos, dimensiones, recuperación, latencia y RU; no hay una opción universal.

8. Ajustar la construcción vectorial y coordinar

Empieza con los valores predeterminados. quantizationByteSize admite 1–512 bytes: un valor mayor conserva más información y utiliza más almacenamiento. En diskANN, indexingSearchListSize admite 10–500 y su valor predeterminado es 100; aumentarlo puede mejorar la recuperación, pero encarece la construcción y la incorporación de vectores.

{
  "vectorIndexes": [{
    "path": "/embedding",
    "type": "diskANN",
    "quantizationByteSize": 64,
    "indexingSearchListSize": 150
  }]
}

Combina el índice vectorial con índices de intervalo o compuestos para categoría, departamento, tipo y fecha. El filtrado previo reduce candidatos y RU. La directiva vectorial es estructural: cambiar dimensiones, tipo o distancia normalmente requiere un contenedor compatible nuevo y migración. float16 ocupa cerca de la mitad que float32 con poco impacto habitual; int8 y uint8 exigen cuantificación evaluada. El coseno es frecuente para embeddings de texto.

Resumen del tema

Ajusta los parámetros solo con métricas de recuperación y latencia y define dimensiones, tipo y distancia antes de producción.

9. Medir la eficiencia y detectar índices ausentes

Las métricas convierten la lentitud en evidencia. La utilización del índice indica cuánto trabajo fue indexado; los documentos recuperados muestran cuántos elementos se leyeron para evaluar; y los documentos de salida muestran cuántos sobrevivieron. Una utilización baja o una relación recuperados/salida alta suele señalar examen, ruta ausente o índice compuesto faltante.

from azure.cosmos import CosmosClient

metrics = {}
def response_hook(headers, _):
    metrics["query"] = headers.get("x-ms-documentdb-query-metrics", "")
    metrics["ru"] = headers.get("x-ms-request-charge", "")

items = list(container.query_items(
    query="SELECT * FROM c WHERE c.documentType = @type ORDER BY c.uploadDate DESC",
    parameters=[{"name": "@type", "value": "pdf"}],
    populate_query_metrics=True,
    response_hook=response_hook
))

print(metrics["query"])
print(f'{metrics["ru"]} RUs')

Captura x-ms--charge, cambia una hipótesis, espera la transformación y repite el mismo ensayo. TOP limita la salida, pero no corrige un filtro sin índice. Compara percentiles y consultas representativas.

Resumen del tema

Utilización, relación recuperados/salida y cobro de RU demuestran si un índice reduce realmente el trabajo.

10. Equilibrar el costo de RU entre lecturas y escrituras

Las lecturas indexadas suelen consumir RU según los resultados; los exámenes crecen con los datos. Sin embargo, cada ruta e índice compuesto añade almacenamiento y RU de escritura. Búsqueda, informes y paneles de lectura intensiva justifican mayor cobertura; ingesta masiva, actualizaciones de embeddings, y lotes favorecen menos índices.

  • Catalogar WHERE, ORDER BY, agregaciones, combinaciones, direcciones y frecuencia.
  • Cubrir los cinco a diez patrones con mayor beneficio medido.
  • Excluir de los índices de intervalo texto solo mostrado, brutos y vectores.
  • Probar cardinalidad, sesgo, distribución de particiones y cantidades realistas de vectores.
  • Comparar RU de lectura y escritura antes de aprobar la directiva.

Los datos sintéticos uniformes ocultan categorías calientes y particiones desiguales. Carga distribuciones parecidas a producción y decide según el costo total observado.

Resumen del tema

La mejor directiva minimiza el costo completo: muchas lecturas justifican índices y muchas escrituras premian la selectividad.

11. Comparar los cinco niveles de coherencia y su efecto en RU

Garantías de coherencia y costo de lectura.
NivelGarantía y uso habitualRU relativa
FuerteLectura linealizable del último valor confirmado; datos regulados o críticos. No admite varias regiones de escritura.
Obsolescencia limitadaRetraso máximo de K versiones o T tiempo; límite predecible con una región de escritura.
SesiónRead-your-writes dentro de una sesión; opción práctica para aplicaciones de usuario.
Prefijo coherenteNunca observa escrituras fuera de orden, aunque puedan estar obsoletas; registros y secuencias.
EventualSin garantía de actualidad u orden; mayor rendimiento y menor latencia para análisis y segundo plano.

Fuerte y obsolescencia limitada leen dos réplicas, por lo que el rendimiento de lectura por RU es aproximadamente la mitad que en sesión, prefijo coherente o eventual. Las RU de escritura de la operación son iguales, pero la coherencia fuerte espera la mayoría global y aumenta la latencia. Los niveles más débiles confirman en la mayoría local antes de replicar asincrónicamente.

Espectro de coherencia avanza desde actualidad fuerte y mayor costo hasta más disponibilidad, rendimiento y menor latencia eventual.
Escoge la garantía más débil que todavía cumpla la interacción empresarial.

Resumen del tema

La coherencia equilibra actualidad, latencia, disponibilidad y costo; más fuerte no siempre es mejor.

12. Garantizar read-your-writes con de sesión y PBS

La coherencia de sesión es apropiada cuando el usuario debe encontrar inmediatamente el documento o embedding que acaba de cargar. El representa el avance de una partición. Una instancia del lo administra automáticamente, pero los servicios distribuidos deben propagar el de la escritura a la lectura. Otras sesiones pueden observar datos anteriores temporalmente.

from azure.cosmos import CosmosClient, ConsistencyLevel

client = CosmosClient(
    url=endpoint,
    credential=credential,
    consistency_level=ConsistencyLevel.Session
)

session = {}
def capture(headers, _):
    session["token"] = headers.get("x-ms-session-token", "")

container.create_item(body=document, response_hook=capture)

results = container.query_items(
    query="SELECT * FROM c WHERE c.category = @category",
    parameters=[{"name": "@category", "value": "proposals"}],
    session_token=session.get("token")
)

Clientes separados pueden aplicar coherencia fuerte a lecturas críticas y eventual a análisis. En varias regiones, la fuerte espera las regiones lejanas y no admite varias regiones de escritura; la obsolescencia limitada encaja mejor con una región de escritura; sesión y niveles más débiles confirman localmente. Las métricas de Obsolescencia Limitada Probabilísticamente (PBS) de revelan con qué frecuencia una lectura eventual ya devuelve datos actuales y ayudan a decidir si es seguro debilitar la garantía.

Resumen del tema

Propaga entre servicios para visibilidad inmediata y consulta PBS antes de debilitar la coherencia del usuario.

13. Laboratorio guiado: comparar índices vectoriales con datos realistas

El ejercicio de referencia propone 30 minutos para comparar flat, quantizedFlat y diskANN. Requiere una suscripción de con permisos de implementación, , la versión más reciente de la CLI de y Python 3.12 o posterior. Utiliza un grupo de recursos desechable.

  1. Obtener los archivos iniciales y parametrizar la implementación.
  2. Implementar una cuenta de for con búsqueda vectorial.
  3. Crear tres contenedores idénticos salvo por el índice vectorial.
  4. Cargar los mismos documentos y embeddings.
  5. Crear funciones de Python que ejecuten las mismas consultas VectorDistance con y sin filtros.
  6. Mostrar latencia, RU y coincidencia de resultados en una aplicación Flask.
  7. Repetir con al menos 1.000 vectores y selectividad realista.
  8. Registrar recuperación frente a flat, latencia mediana y de cola, RU y almacenamiento y elegir según el objetivo.

No compares índices con datos, particiones, vectores o filtros diferentes. El calentamiento y las colecciones pequeñas distorsionan resultados; repite cada escenario y presenta la distribución.

Resumen del tema

Una comparación justa mantiene constantes datos y consultas y mide recuperación, latencia, RU y almacenamiento en escala realista.

14. Revisión razonada de la evaluación

  1. Filtro documentType y orden uploadDate DESC: índice compuesto documentType ASC seguido de uploadDate DESC.
  2. Unos 500.000 embeddings por partición y aproximación aceptable: diskANN está orientado a esa escala.
  3. Embeddings usados solo para similitud: excluir su ruta del índice de intervalo y conservar el índice vectorial.
  4. El usuario debe ver su carga: coherencia de sesión y de escritura propagado a la lectura.
  5. Baja utilización y relación recuperados/salida alta: hay examen; revisar predicados y agregar índice de intervalo o compuesto.

Los distractores reflejan errores comunes: índices de intervalo separados no resuelven la ordenación multipropiedad, deshabilitar toda indexación perjudica otras consultas, aumentar el rendimiento no crea actualidad y TOP no arregla filtrado ineficaz.

Resumen del tema

La respuesta correcta sigue la forma de la consulta, la escala vectorial, el almacenamiento, la garantía y la métrica observada.

15. Lista final y referencias oficiales

  • Inventariar consultas antes de escribir la directiva.
  • Indexar la clave de partición cuando una directiva de exclusión todavía la filtra.
  • Usar índices de intervalo, compuestos, espaciales, de tupla y vectoriales solo en patrones compatibles.
  • Excluir embeddings del índice de intervalo y medir el ámbito real de la búsqueda.
  • Agregar el índice sustituto antes de quitar el anterior.
  • Validar RU y latencia con datos realistas y transformación completa.
  • Usar coherencia de sesión para visibilidad inmediata y niveles más débiles cuando se acepta retraso.

Referencias oficiales de Microsoft

  1. Directivas de indexación en
  2. Administrar directivas de indexación en for
  3. Búsqueda de vectores en para
  4. Optimizar el costo de las solicitudes en
  5. Niveles de coherencia en
  6. Administrar niveles de coherencia

Resumen del tema

Una búsqueda eficaz combina indexación selectiva, decisiones vectoriales medidas, transformaciones seguras y la coherencia menos costosa que conserva la experiencia requerida.