Consulta SQL++ / N1QL

Mejoras de ANSI JOIN y ANSI MERGE

Introducción

El soporte de N1QL para ANSI JOIN se introdujo por primera vez en la versión 5.5. Actualmente existe una restricción en ANSI JOIN (versiones 5.5 y 6.0) en el sentido de que el lado derecho de un ANSI JOIN debe ser un espacio de claves. Esta restricción se suprimirá en la versión 6.5.

El soporte N1QL para la sentencia MERGE utiliza actualmente la cláusula ON KEYS, similar a lookup join. La versión 6.5 soportará la sintaxis MERGE ANSI.

 

Mejoras de ANSI JOIN

En la versión 6.5 de Couchbase Server, N1QL añade soporte para expresión y subconsulta como lado derecho de un ANSI JOIN. Anteriormente en las versiones 5.5 y 6.0, el lado derecho de un ANSI JOIN debía ser un espacio de claves. Se devuelve un error si el lado derecho de un ANSI JOIN no es un espacio de claves.

La restricción para el espacio clave sólo existe en las versiones 5.5 y 6.0, y sólo se aplica al lado derecho de un ANSI JOIN. El lado izquierdo de un ANSI JOIN puede ser un espacio clave, una expresión, una subconsulta u otra operación join/nest/unnest, siempre que ANSI JOIN no se mezcle con una operación join/nest que no sea ANSI.

Expresión como lado derecho de un ANSI JOIN

Ahora se puede utilizar una expresión en el lado derecho de ANSI JOIN. Por ejemplo:

En este ejemplo, se especifica una matriz explícita de objetos como una expresión en el lado derecho de un ANSI JOIN. Tenga en cuenta que cuando se utiliza una expresión en el lado derecho de un ANSI JOIN, la expresión debe tener un alias ("ruta" en el ejemplo anterior, aunque la palabra clave AS es opcional). 

Cuando se utiliza una expresión en el lado derecho de un ANSI JOIN, se utiliza un operador ExpressionScan para iterar a través del conjunto de resultados de la expresión en el plan explain:

 

Subconsulta como lado derecho de un ANSI JOIN

También se puede utilizar una subconsulta en el lado derecho de ANSI JOIN. Por ejemplo:

En este ejemplo, se utiliza una subconsulta en el lado derecho de un ANSI JOIN. Al igual que una expresión, cuando se utiliza una subconsulta en el lado derecho de un ANSI JOIN, la subconsulta también debe tener un alias ("ruta" en el ejemplo anterior, aunque la palabra clave AS es opcional).

Cuando se utiliza una subconsulta en el lado derecho de un ANSI JOIN, la explicación muestra el plan de la propia subconsulta:

Cuando se utiliza una subconsulta como lado derecho de un ANSI JOIN, no puede ser una subconsulta correlacionada. Se devolverá un error si se utiliza una subconsulta correlacionada en el lado derecho de un ANSI JOIN.

Hash join utilizado cuando una expresión o una subconsulta está en el lado derecho de un ANSI JOIN

Cuando se utiliza un espacio de claves en el lado derecho de un ANSI JOIN, la unión en bucle anidado es el método de unión por defecto, y se considera la unión hash cuando se especifica la sugerencia USE HASH en el espacio de claves del lado derecho. Además, se requiere un índice secundario apropiado en el espacio clave cuando se utiliza la unión de bucle anidado. Por el contrario, cuando se utiliza una expresión o una subconsulta en el lado derecho de un ANSI JOIN, como no hay índice en una expresión o una subconsulta, es más eficiente utilizar una unión hash para realizar la unión. En este caso, una unión de bucle anidado es una unión cartesiana, ya que el conjunto de resultados de la expresión o subconsulta debe explorarse repetidamente para cada documento externo. Como resultado, cuando una expresión o subconsulta se encuentra en el lado derecho de un ANSI JOIN, la unión hash es el método de unión por defecto, incluso sin especificar la sugerencia USE HASH. Si no se puede utilizar la unión hash, por ejemplo, si no hay un predicado de unión de igualdad, o cuando se utiliza la sugerencia USE NL, o cuando se utiliza la edición community (la unión hash sólo está disponible en la edición enterprise), entonces se considera la unión de bucle anidado. Si se observan los archivos de explicación anteriores para los casos de expresión y subconsulta como lado derecho de un ANSI JOIN, se puede encontrar un operador HashJoin utilizado en ambos archivos de explicación.

Cuando se utiliza un espacio clave en el lado derecho de un ANSI JOIN, se puede especificar una sugerencia USE INDEX o USE KEYS en el espacio clave. Cuando se utiliza una expresión o una subconsulta en el lado derecho de un ANSI JOIN, no se puede especificar una sugerencia USE INDEX o USE KEYS en la expresión o subconsulta, por razones obvias. La única pista disponible en este caso es una pista join (USE HASH o USE NL).

Compatibilidad con ANSI NEST

La misma mejora se aplica también a ANSI NEST, es decir, ahora puede utilizar una expresión o una subconsulta como lado derecho de un ANSI NEST.

 

FUSIÓN ANSI

Una sentencia MERGE permite fusionar documentos del "origen" en el "destino", es decir, cuando se encuentra una coincidencia, se puede actualizar el documento destino; cuando no se encuentra ninguna coincidencia, se puede insertar un documento en el destino.

El concepto de "coincidencia" viene determinado por la condición de coincidencia. En versiones anteriores de Couchbase N1QL sólo soporta una "coincidencia" basada en la clave del documento, es decir, la fuente debe producir una clave de documento para el destino, para determinar si se encuentra una coincidencia (si el documento con esa clave de documento ya existe en el destino). Esto se consigue mediante la cláusula ON KEYS de la sintaxis de la sentencia MERGE.

La sentencia MERGE con la cláusula ON KEYS se denomina look-up merge. Es similar a la sintaxis join anterior a la compatibilidad con ANSI JOIN, es decir, look-up join, que también requiere la unión en la clave del documento y utiliza la cláusula ON KEYS. Por lo tanto, una extensión natural de la sentencia MERGE es utilizar la sintaxis ANSI MERGE, es decir, utilizar la cláusula ON para especificar la condición de fusión, de forma que se pueda utilizar una expresión arbitraria para determinar si existe o no una coincidencia. ANSI MERGE está soportado en N1QL en la versión 6.5 del servidor Couchbase.

A continuación se muestra un ejemplo de sentencia MERGE ANSI:

En este ejemplo, la condición de fusión se especifica mediante una cláusula ON. Esto es muy similar a la cláusula ON de un ANSI JOIN. De hecho, internamente la sentencia ANSI MERGE utiliza ANSI JOIN con la misma cláusula ON para determinar si existe una coincidencia para cualquier documento fuente.

La explicación de la declaración de fusión anterior:

En la explicación puede ver un operador NestedLoopJoin que se utiliza para la operación ANSI JOIN (transformada internamente) entre el origen y el destino.

Se puede especificar una sugerencia de unión en la fuente:

En este ejemplo se especifica la sugerencia USE HASH en el aeropuerto.

Tratamiento de coincidencias múltiples en ANSI MERGE

En la fusión por búsqueda, como la condición de fusión es la clave del documento, sólo hay una coincidencia potencial con el documento de destino para cada documento de origen. En la fusión ANSI, como la condición de fusión es ahora una expresión arbitraria, puede haber múltiples coincidencias de documentos de destino para cada documento de origen. Para cada acción de fusión especificada, la acción de fusión sólo puede ejecutarse como máximo una vez para cada documento de origen. En caso de coincidencias múltiples, si se intenta una acción de fusión por segunda vez para el mismo documento fuente, se devolverá un error (código de error 5320 o 5330). Si se produce un error de este tipo, es necesario refinar la condición de fusión (cláusula ON) para evitar coincidencias múltiples para el mismo documento fuente.

Acción INSERT para ANSI MERGE

En la fusión por consulta, si se especifica una acción INSERT, sólo se proporciona el documento que se está insertando. Dado que la fusión por búsqueda requiere una coincidencia en la clave del documento, y la acción INSERT sólo se activa cuando no se encuentra ninguna coincidencia (es decir, no existe ningún documento con esa clave de documento en el destino), el nuevo documento insertado simplemente utilizará la misma clave de documento. En el caso de ANSI MERGE, esto ya no es cierto, puesto que ya no es necesario que una clave de documento sea la condición de coincidencia. En consecuencia, cuando se especifica una acción INSERT, también debe especificarse una clave de documento como parte de la acción INSERT. Por ejemplo:

En comparación, ésta es la sintaxis de la acción INSERT para look-up merge:

donde es el documento que se va a insertar.

Esta es la sintaxis de la acción INSERT para ANSI MERGE:

donde especifica la clave del documento recién insertado y especifica el nuevo documento. Los dos están separados por una coma.

Se pueden utilizar dos formas, las palabras clave KEY y VALUE son opcionales. También se requiere un nuevo par de paréntesis.

Las demás acciones de fusión (acción UPDATE, acción DELETE) siguen siendo las mismas entre look-up merge y ANSI MERGE.

 

Resumen

Las mejoras para ANSI JOIN y el soporte para ANSI MERGE en Couchbase 6.5 mejoran el cumplimiento ANSI de N1QL, y hace que N1QL sea más fácil de usar, especialmente para la migración desde una base de datos relacional.

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

Autor

Publicado por Bingjie Miao, Ingeniero Principal de Software de Couchbase

Bingjie Miao es ingeniero de software principal en Couchbase. Bingjie tiene 20 años de experiencia en bases de datos relacionales y NoSQL. Su principal área de especialización es la optimización y ejecución de consultas.

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.