Tres formas de aprovechar los índices compuestos en Azure Cosmos DB

Publicado el 19 septiembre, 2019

Program Manager, Azure Cosmos DB

Los índices compuestos se introdujeron en Azure Cosmos DB en Microsoft Build 2019. Con nuestra última actualización del servicio, los tipos de consulta adicionales ahora pueden aprovechar los índices compuestos. En esta publicación, exploraremos los índices compuestos y destacaremos algunos casos de uso habituales.

Tipos de índice en Azure Cosmos DB

Azure Cosmos DB tiene actualmente los siguientes tipos de índice que se emplean para los siguientes tipos de consultas:

Índices de rango:

  • Consultas de igualdad
  • Consultas por rango
  • Consultas ORDER BY en una única propiedad
  • Consultas JOIN

Índices espaciales

  • Funciones geoespaciales

Índices compuestos:

  • Consultas ORDER BY en varias propiedades
  • Consultas con un filtro y una cláusula ORDER BY
  • Consultas con un filtro en dos o más propiedades

Casos de uso de índices compuestos

De forma predeterminada, Azure Cosmos DB creará un índice de rango en cada propiedad. Estos son suficientes para muchas cargas de trabajo y no son necesarias más optimizaciones. Se puede agregar índices compuestos, además de los índices de rango predeterminados. Los índices compuestos tienen una ruta y una orden (ASC o DESC) definidas para cada propiedad dentro del índice compuesto.

Consultas ORDER BY en varias propiedades

Si una consulta tiene una cláusula ORDER BY con dos o más propiedades, es necesario un índice compuesto. Por ejemplo, la siguiente cláusula requiere un índice compuesto definido sobre edad y nombre (edad ASC, nombre ASC):

SELECT * FROM c ORDER BY c.age ASC, c.name ASC

Esta consulta clasificará todos los resultados en orden ascendente por el valor de la propiedad edad. Si dos documentos tienen el mismo valor de edad, la consulta ordenará los documentos por nombre.

Consultas con un filtro y una cláusula ORDER BY

Si una consulta tiene un filtro y una cláusula ORDER BY en distintas propiedades, un índice compuesto mejorará el rendimiento. Por ejemplo, la siguiente consulta requerirá menos unidades de solicitud (RU) si se define un índice compuesto sobre nombre y edad y la consulta se actualiza para que incluya el nombre en la cláusula ORDER BY:

Consulta original que utiliza un índice de rango:

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.age ASC

Consulta revisada que utiliza un índice compuesto en nombre y edad:

SELECT * FROM c WHERE c.name = “Tim” ORDER BY c.name ASC, c.age ASC

Aunque un índice compuesto mejorará considerablemente el rendimiento de la consulta, todavía puede ejecutar la consulta original correctamente sin un índice compuesto. Cuando ejecute la consulta revisada con un índice compuesto, ordenará documentos por la propiedad edad. Dado que todos los documentos que coinciden con el filtro tienen el mismo valor de nombre, la consulta los devolverá en orden ascendente por edad.

Consultas con un filtro en varias propiedades

Si una consulta tiene un filtro con dos o más cláusulas, la adición de un índice compuesto mejorará el rendimiento.

Considere la siguiente consulta:

SELECT * FROM c WHERE c.name = “Tim” and c.age > 18

En ausencia de un índice compuesto en (nombre ASC y edad ASC), utilizaremos un índice de rango para esta consulta. Podemos mejorar la eficiencia de esta consulta creando un índice compuesto para nombre y edad.

Las consultas con varios filtros de igualdad y un máximo de un filtro de rango (como >, <, <=, >=, !=) utilizarán el índice compuesto. En algunos casos, si una consulta no puede utilizar por completo un índice compuesto, se usará una combinación de los índices compuestos y los índices de rango definidos. Para obtener más información, consulte nuestra documentación de la directiva de indexación.

Beneficios de rendimiento de los índices compuestos

Podemos ejecutar algunas consultas de muestra para destacar los beneficios de rendimiento de los índices compuestos. Utilizaremos un conjunto de datos de nutrición que se utiliza en laboratorios de Azure Cosmos DB.

En este ejemplo, optimizaremos una consulta que tiene un filtro y una cláusula ORDER BY. Comenzaremos por la directiva de indexación predeterminada que indexa todas las propiedades con un índice de rango. Al ejecutar la siguiente consulta como se menciona en la imagen siguiente en Azure Portal, observamos las métricas de consulta:

Métricas de consulta:

Consulta que utiliza un índice de rango y consume 21,8 RU.

Esta consulta, con la directiva de indexación predeterminada, requería 21,8 RU.

Al agregar un índice compuesto sobre foodGroup y _ts y actualizar el texto de la consulta para incluir foodGroup en la cláusula ORDER BY se redujo considerablemente la carga de RU de la consulta.

Métricas de consulta:

Consulta que utiliza un índice compuesto y consume 4,07 RU.

Tras agregar un índice compuesto, la carga de RU de la consulta disminuyó de 21,8 RU a solo 4,07 RU. Esta optimización de la consulta tendrá mayor impacto a medida que aumente el tamaño total de los datos. Los beneficios de un índice compuesto son significativos cuando las propiedades en la cláusula ORDER BY tiene una cardinalidad alta.

Creación de índices compuestos

Puede obtener más información sobre la creación de índices compuestos en esta documentación. La directiva de indexación se puede actualizar con facilidad directamente a través de Azure Portal. Al crear un índice compuesto para los datos que ya están en Azure Cosmos DB, la actualización del índice utilizará las RU sobrantes de las operaciones normales. Una vez que se defina la nueva directiva de indexación, Azure Cosmos DB indexará automáticamente las propiedades con un índice compuesto a medida que se escriben.

Descubra si los índices compuestos mejorarán la utilización de RU para sus cargas de trabajo existentes en Azure Cosmos DB.