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
Por João Ricardo Dutra••Contenido original completo
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.
Familia
Uso principal
Intervalo
Igualdad, comparación, ORDER BY de una propiedad, funciones de cadena e IS_DEFINED.
Compuesto
ORDER BY de varias propiedades y combinaciones frecuentes de igualdad e intervalo.
Espacial
ST_DISTANCE, ST_WITHIN y ST_INTERSECTS para información geográfica.
Vectorial
Similitud de embeddings mediante VectorDistance.
Tupla
Varios campos pertenecientes al mismo elemento de una matriz.
Texto completo
Bú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.
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.
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.
Tipo
Comportamiento y límite
Ámbito típico
flat
exacta; máximo 505 dimensiones.
Pocos candidatos o necesidad de recuperación del 100%.
quantizedFlat
Vectores 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.
diskANN
Vecinos 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.
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.
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.
Nivel
Garantía y uso habitual
RU relativa
Fuerte
Lectura linealizable del último valor confirmado; datos regulados o críticos. No admite varias regiones de escritura.
2×
Obsolescencia limitada
Retraso máximo de K versiones o T tiempo; límite predecible con una región de escritura.
2×
Sesión
Read-your-writes dentro de una sesión; opción práctica para aplicaciones de usuario.
1×
Prefijo coherente
Nunca observa escrituras fuera de orden, aunque puedan estar obsoletas; registros y secuencias.
1×
Eventual
Sin garantía de actualidad u orden; mayor rendimiento y menor latencia para análisis y segundo plano.
1×
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.
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.
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.
Obtener los archivos iniciales y parametrizar la implementación.
Implementar una cuenta de for con búsqueda vectorial.
Crear tres contenedores idénticos salvo por el índice vectorial.
Cargar los mismos documentos y embeddings.
Crear funciones de Python que ejecuten las mismas consultas VectorDistance con y sin filtros.
Mostrar latencia, RU y coincidencia de resultados en una aplicación Flask.
Repetir con al menos 1.000 vectores y selectividad realista.
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
Filtro documentType y orden uploadDate DESC: índice compuesto documentType ASC seguido de uploadDate DESC.
Unos 500.000 embeddings por partición y aproximación aceptable: diskANN está orientado a esa escala.
Embeddings usados solo para similitud: excluir su ruta del índice de intervalo y conservar el índice vectorial.
El usuario debe ver su carga: coherencia de sesión y de escritura propagado a la lectura.
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.
Una búsqueda eficaz combina indexación selectiva, decisiones vectoriales medidas, transformaciones seguras y la coherencia menos costosa que conserva la experiencia requerida.