Análisis de Couchbase

Optimización de consultas analíticas - Desmitifiquemos Listify

Couchbase Analytics está diseñado para soportar consultas ad hoc aprovechando un eficiente procesamiento paralelo. Esto es especialmente útil cuando los resultados de una consulta te llevan a buscar respuestas en otra consulta. (Para los analistas, en otras palabras, ¡todo el tiempo!) Como ocurre con cualquier plataforma de datos, estas consultas secundarias a veces pueden dar lugar a tiempos de ejecución significativamente distintos de los de la primera. Recientemente hemos trabajado con un cliente que observó una notable disminución del rendimiento tras realizar un pequeño cambio en su consulta. A continuación se describe el proceso que seguimos para aislar y resolver el problema.

Los datos

Como siempre, el primer paso para entender una consulta es familiarizarse con los datos subyacentes. En este caso, los datos se componen de documentos JSON, cada uno de los cuales es una descripción de los cargos por servicios de los clientes. Los cargos de cada sesión se incluyen en una matriz:

Un par de notas sobre el diseño del modelo de datos:

  • Los nombres de campo son lo bastante largos para ser descriptivos, pero lo bastante cortos para ahorrar espacio. Los nombres de campo de la matriz podrían haberse escrito fácilmente como "quantity", "revenueCode", "service", "amount", "serviceDate". Sin embargo, para 100 millones de instancias se habrían necesitado 3,73 GB de espacio adicional antes de la compresión.
  • Utilizaban fechas de época, sin milisegundos. Si estas fechas se almacenaran en formato ISO 8601 ("2020-07- 24T18:17:49" o con milisegundos "2020-07-24T18:17:49.000") requerirían el doble de espacio de almacenamiento.

Consulta inicial

La consulta inicial se diseñó para recuperar la combinación cliente/servicio con mayores ingresos dentro de cada una de las categorías de códigos de ingresos:

Algunas notas sobre el diseño de la consulta:

  • Se accede al contenido de la matriz mediante el verbo "unnest". Esto permite agregar los valores y devolverlos como un registro aplanado.
  • La última fecha de servicio se convierte de época a fecha legible por humanos mediante la función millis_to_str().
  • La función de ventana "rank() over partition" se utiliza en la cláusula where de la consulta externa como medio eficaz de devolver sólo el valor superior dentro de cada código de ingresos.
  • La función round() es cosmética, pero se utiliza habitualmente en informes en los que los céntimos no son significativos.

La desaceleración

Surgieron problemas cuando se añadió un cálculo de descuento por volumen (20% de descuento cuando la cantidad acumulada de un servicio es igual o superior a 10). Esta nueva consulta tardaba seis veces más en ejecutarse.

¿Cómo podemos averiguar la causa?

Explícate

La consola de consulta Analytics facilita la inspección del plan de ejecución de cualquier consulta, simplemente haciendo clic en el botón "Plan". La figura (1) muestra el plan de ejecución de esta consulta. No se preocupe por la minúscula escala del diagrama; puede utilizar los controles para ampliarlo y contraerlo. También puede hacer clic en cada paso individual para obtener información detallada.

Figure 1

Figura 1

Si lo prefiere, también puede hacer clic en el botón "Texto del plan" para generar un documento JSON que describa el plan:

 

A medida que las consultas se hacen más complejas, el anidamiento puede llegar a ser muy profundo (y algo difícil de leer). Un truco que utilizan a menudo nuestros ingenieros es anteponer el comando "explicar texto" a la consulta:

Esto proporciona una descripción detallada del plan sin los paréntesis garabateados:

Esto es lo que utilizaremos para buscar pistas.

Hagamos una lista

Estamos bastante seguros de que la ralentización se introdujo cuando añadimos la sentencia CASE que define el campo adjDollars, así que empecemos buscando la lógica case. La encontramos en la línea 33:

A medida que seguimos la lógica en las líneas siguientes, vemos que el plan de ejecución continúa asignando e intercambiando variables de forma particionada. En la línea 44, sin embargo, vemos lo siguiente:

En los casos en los que el rendimiento de la consulta o el consumo de memoria son una preocupación, la función "listify" puede ser una señal de alarma. (Tiene su utilidad, sobre todo en la transformación interna de agregados de matrices, pero también puede ser utilizada por el plan de ejecución como función de último recurso. En nuestro caso, vemos que la variable $$117 es el resultado de este proceso de listificación. Este $$117, podemos verlo en el switch-case anterior, está asociado al objeto sum(c.amt) de la consulta. Así que vamos a intentar mover el cálculo de las sumas fuera del caso switch interior y hacerlas parte de un LET:

Una vez hecho esto y reexaminado el plan de explicación, vemos que su longitud se ha reducido a la mitad, y que el proceso de ejecución ya no incluye las funciones listify. La ejecución de la consulta, por tanto, debería mostrar un rendimiento mucho mejor, como de hecho ocurre. Problema resuelto.

Una nota final: nuestros ingenieros siempre están buscando formas de mejorar nuestro optimizador de consultas. Si en el curso de la optimización de una de sus consultas encuentra en el texto explicativo una función "listify" maliciosa (lo que ya es raro, y cada vez más raro), por favor, abra un ticket de soporte en support.couchbase.com, subiendo su plan explicativo para que puedan echarle un vistazo. De hecho, directamente como resultado de su trabajo con el cliente mencionado anteriormente, este ejemplo en particular (switch-case utilizado con una función agregada) será, a partir de la versión 6.6 de Couchbase, automáticamente reescrito por el optimizador.

Documentos y recursos

El sitio de documentación de Couchbase contiene enlaces a la referencia del lenguaje N1QL for Analytics: https://docs.couchbase.com/server/current/analytics/introduction.html. También puede encontrar allí un enlace a un tutorial sobre el lenguaje y al libro de Don Chamberlin (coinventor del lenguaje SQL): https://www.couchbase.com/sql-plus-plus-for-sql-users.

 

Muchas gracias a Dmitry Lychagin y Mike Carey por su cuidadosa revisión de este post.

 

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por Peter Reale

Peter Reale es Ingeniero Senior de Soluciones en Couchbase y lleva en el negocio de los datos desde 1984. Reside en Los Ángeles.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.