El objetivo de Couchbase es permitir que cada vez más aplicaciones empresariales aprovechen y adopten el modelo de datos NoSQL/JSON. N1QL simplifica esta transición de las bases de datos relacionales tradicionales, y está construido con toneladas de características para lograr lo mejor de ambos mundos. Continuando el tren de Couchbase Server 4.5, la versión 4.5.1 trae múltiples mejoras de funcionalidad, usabilidad y rendimiento en N1QL. Estas mejoras abordan muchos de los problemas críticos de nuestros clientes, y en general muestran la fuerza y sofisticación de N1QL.

Mientras que algunas de las nuevas mejoras mejoran la funcionalidad existente, otras, como la función SUFFIXES(), enriquecen las consultas N1QL con una mejora del rendimiento de las consultas LIKE. Otras mejoras se refieren a la creación y manipulación dinámica de objetos JSON, la precisión de los números, la sintaxis UPDATE para matrices anidadas, etc,

Estoy seguro de que esto necesitará una serie, pero en este blog destacaré las mejoras de LIKE-query y UPDATE. Ver Couchbase Server 4.5.1 Novedades y notas de la versión para consultar la lista completa de mejoras de N1QL. ¡Felicitaciones al equipo de N1QL!

Comparación eficaz de patrones en consultas LIKE con SUFFIXES()

La concordancia de patrones es una funcionalidad muy utilizada en las consultas SQL, y normalmente se consigue utilizando el operador LIKE. En particular, es muy importante que la búsqueda de comodines sea eficiente. LIKE 'foo%' puede implementarse eficientemente con un índice estándar, pero no LIKE '%foo%'. Este tipo de coincidencia de patrones con comodín inicial es vital para cualquier aplicación que tenga un cuadro de búsqueda para coincidir con palabras parciales o para sugerir de forma inteligente un texto coincidente. Por ejemplo,

  • Un sitio web de reservas de viajes que quiere mostrar aeropuertos coincidentes cuando el usuario empieza a introducir algunas letras del nombre del aeropuerto.
  • Un usuario que busca todos los correos electrónicos con una palabra específica o parcial en el asunto.
  • Encontrar todos los temas de un foro o entradas de blog con palabras clave específicas en el título.

En Couchbase Server 4.5.1, N1QL aborda este problema añadiendo una nueva función de cadena SUFFIXES(), y combinándola con la funcionalidad de Indexación de Array introducida en Couchbase Server 4.5. Juntas, aportan una diferencia de magnitud al rendimiento de las consultas LIKE con comodines principales como LIKE "%foo%". La funcionalidad principal de SUFFIXES() es muy simple, básicamente produce un array de todas las posibles subcadenas de sufijos de una cadena dada. Por ejemplo

La siguiente imagen muestra una técnica única para combinar SUFIXES() con la indexación de matrices para impulsar mágicamente COMO rendimiento de la consulta.

  1. Paso1 (en azul) muestra la matriz de subcadenas de sufijos generada por SUFIXES() para doc1.title
  2. El paso2 (en amarillo) muestra el índice de matriz creado con las subcadenas de sufijos generadas en el paso1. Observe que la entrada de índice para "madera" señala doc1 y doc4ya que es una de las subcadenas de sufijos de los títulos de ambos documentos. Del mismo modo, "ood" señala doc1, doc4y doc8.
  3. El paso 3 (en verde) ejecuta una consulta equivalente a SELECT title FROM bucket WHERE title LIKE "%wood%". El predicado LIKE se transforma para utilizar el índice de array utilizando la construcción ANY. Consulte la documentación para obtener más detalles sobre el uso de la indexación de matrices.
    • Tenga en cuenta que, el comodín inicial se elimina en el nuevo LIKE "madera%" predicado.
    • Se trata de una transformación precisa, ya que la búsqueda de índices de matriz para "madera" apunta a todos los documentos cuyo título tiene la subcadena final "madera"
  4. En el paso 4, N1QL busca en el índice de matrices todos los documentos que coincidan con "madera%". Que devuelve {doc1, doc3, doc4}porque
    • la búsqueda en el índice produce un span, que obtiene documentos de "madera" a "wooe"
    • doc1 y doc4 coinciden debido a la entrada de índice "madera" que genera SUFFIXES() al crear el índice de la matriz.
    • doc3 coincide debido a su correspondiente entrada de índice para "bosque"
  5. Por último, en el paso 5, N1QL devuelve los resultados de la consulta.

Veamos un ejemplo práctico con el viaje-muestra que multiplicaron por 12 el rendimiento de la consulta.

  1. Supongamos un documento con un campo de cadena cuyo valor son unas pocas palabras de texto o una frase. Por ejemplo, el título de un monumento, la dirección de un lugar, el nombre de un restaurante, el nombre completo de una persona/lugar, etc., Para esta explicación, consideramos título de hito documentos en viaje-muestra.
  2. Crear índice secundario en título campo utilizando SUFIXES() como:

    SUFIXES(título) genera todas las posibles subcadenas de sufijos de títuloy el índice tendrá entradas para cada una de esas subcadenas, todas ellas referenciando a los documentos correspondientes.
  3. Consideremos ahora la siguiente consulta, que busca todos los documentos con la subcadena "tierra" en título. Esta consulta produce el siguiente plan, y se ejecuta en aproximadamente 120ms en mi portátil. Usted puede ver claramente, que obtiene todos los hito y, a continuación, aplica el LIKE "%land%"para encontrar todos los documentos coincidentes.
  4. En Couchbase 4.5.1, esta consulta puede reescribirse para aprovechar el índice de array idx_title_suffix creado en (2).

Tenga en cuenta que:

  • La nueva consulta de (4) utiliza LIKE "land%"en lugar de LIKE "%land%". El predicado anterior sin comodín inicial '%' produce una búsqueda de índice mucho más eficiente que la posterior, que no puede empujar el predicado al índice.
  • el índice de la matriz idx_title_suffix se crea con todas las posibles subcadenas de sufijos de títuloy, por lo tanto, la búsqueda de cualquier subcadena del sufijo del título puede encontrar una coincidencia satisfactoria.
  • en el plan de consulta 4.5.1 anterior de (4), N1QL desplaza el predicado LIKE a la búsqueda del índice y evita el procesamiento adicional de cadenas de concordancia de patrones. Esta consulta se ejecutó en 18 ms.
  • De hecho, con el siguiente índice de matriz de cobertura, la consulta se ejecutó en 10 ms, es decir, 12 veces más rápido.

Ver esto blog para más detalles sobre una aplicación real de esta función.

Mejoras en UPDATE para trabajar con matrices anidadas

Las aplicaciones empresariales suelen tener datos complejos y necesitan modelar documentos JSON con varios niveles de objetos y matrices anidados. N1QL soporta expresiones complejas y construcciones de lenguaje para navegar y consultar tales documentos con matrices anidadas. N1QL también soporta Indexación de matricescon el que se pueden crear índices secundarios sobre los elementos de la matriz y consultarlos posteriormente.
En Couchbase Server 4.5.1, la función ACTUALIZACIÓN para navegar por matrices anidadas en documentos y actualizar campos específicos en elementos de matrices anidadas. La página PARA-cláusula de la ACTUALIZACIÓN se ha mejorado para evaluar funciones y expresiones, y la nueva sintaxis permite anidar varias sentencias PARA para acceder y actualizar campos en matrices anidadas.
Considere el siguiente documento con matriz anidada como:

El nuevo ACTUALIZACIÓN de 4.5.1 puede utilizarse de diferentes formas para acceder y actualizar matrices anidadas:

Tenga en cuenta que:

  • En SET-evalúa funciones como OBJECT_ADD() y ARRAY_FLATTEN()
  • PARA pueden utilizarse de forma anidada con expresiones para procesar elementos de matrices en diferentes niveles de anidación.

Para ver un ejemplo práctico, considere el cubo de muestra viaje-muestra  incluido en 4.5.1.

  1. En primer lugar, vamos a añadir una matriz anidada de vuelos especiales a la matriz de programación en viaje-muestra cubo, para algunos documentos.
  2. La siguiente sentencia UPDATE añade un tercer campo a cada vuelo especial:

Hay muchas más mejoras importantes en N1QL y características de rendimiento en la versión 4.5.1 de Couchbase Server. Escribiré sobre ellas en mi siguiente blog/parte2.

Descargar 4.5.1 y pruébalo. Hágame saber cualquier pregunta / comentario, o simplemente lo impresionante que es ;-)
¡Salud!

Autor

Publicado por Prasad Varakur, Director Principal de Producto, Couchbase

Prasad Varakur es director de producto principal de Couchbase. Prasad es líder de producto e ingeniería en bases de datos (SQL, noSQL, Bigdata) y sistemas distribuidos.

Dejar una respuesta