stringtranslate.com

Unirse (SQL)

Un diagrama de Venn que representa la declaración SQL de unión completa entre las tablas A y B.

Una cláusula de unión en el lenguaje de consulta estructurado ( SQL ) combina columnas de una o más tablas en una nueva tabla. La operación corresponde a una operación de unión en álgebra relacional . De manera informal, una unión une dos tablas y coloca en la misma fila registros con campos coincidentes: INNER, LEFT OUTER, y .RIGHT OUTERFULL OUTERCROSS

Tablas de ejemplo

Para explicar los tipos de unión, el resto de este artículo utiliza las siguientes tablas:

Department.DepartmentIDes la clave principal de la Departmenttabla, mientras que Employee.DepartmentIDes una clave externa .

Tenga en cuenta que en Employee, "Williams" aún no ha sido asignado a un departamento. Además, no se ha asignado ningún empleado al departamento de "Marketing".

Estas son las declaraciones SQL para crear las tablas anteriores:

CREAR TABLA departamento (   DepartmentID INT CLAVE PRIMARIA NO NULA ,      NombreDepartamento VARCHAR ( 20 ) );CREAR TABLA empleado (    Apellido VARCHAR ( 20 ),  DepartmentID INT REFERENCIAS departamento ( DepartmentID )   );INSERTAR EN el departamento  VALORES ( 31 , 'Ventas' ),   ( 33 , 'Ingeniería' ),  ( 34 , 'clerical' ),  ( 35 , 'Márketing' ); INSERTAR EN empleado  VALORES ( 'Rafferty' , 31 ),   ( 'Jones' , 33 ),  ( 'Heisenberg' , 33 ),  ( 'Robinson' , 34 ),  ( 'Smith' , 34 ),  ( 'Williams' , NULO ); 

unión cruzada

CROSS JOINDevuelve el producto cartesiano de filas de tablas en la unión. En otras palabras, producirá filas que combinan cada fila de la primera tabla con cada fila de la segunda tabla. [1]

Ejemplo de unión cruzada explícita:

SELECCIONAR * DEL departamento CROSS JOIN del empleado ;     

Ejemplo de unión cruzada implícita:

SELECCIONAR * DE empleado , departamento ;   

La unión cruzada se puede reemplazar con una unión interna con una condición siempre verdadera:

SELECCIONAR * DEL empleado INNER JOIN departamento ON 1 = 1 ;       

CROSS JOINno aplica ningún predicado para filtrar filas de la tabla unida. Los resultados de a CROSS JOINse pueden filtrar usando una WHEREcláusula, que luego puede producir el equivalente a una combinación interna.

En el estándar SQL:2011 , las uniones cruzadas son parte del paquete opcional F401, "Tabla unida extendida".

Los usos normales son para comprobar el rendimiento del servidor. [ ¿ por qué? ]

Unir internamente

Una combinación interna (o combinación ) requiere que cada fila de las dos tablas unidas tenga valores de columna coincidentes y es una operación de combinación comúnmente utilizada en aplicaciones , pero no se debe asumir que sea la mejor opción en todas las situaciones. La combinación interna crea una nueva tabla de resultados combinando los valores de las columnas de dos tablas (A y B) según el predicado de la combinación. La consulta compara cada fila de A con cada fila de B para encontrar todos los pares de filas que satisfacen el predicado de unión. Cuando el predicado de unión se satisface al hacer coincidir valores no NULL , los valores de columna para cada par de filas coincidentes de A y B se combinan en una fila de resultado.

El resultado de la unión se puede definir como el resultado de tomar primero el producto cartesiano (o unión cruzada) de todas las filas de las tablas (combinando cada fila de la tabla A con cada fila de la tabla B) y luego devolver todas las filas que satisfacen el unir predicado. Las implementaciones reales de SQL normalmente utilizan otros enfoques, como uniones hash o uniones tipo-fusión , ya que calcular el producto cartesiano es más lento y a menudo requeriría una cantidad prohibitiva de memoria para almacenar.

SQL especifica dos formas sintácticas diferentes de expresar uniones: la "notación de unión explícita" y la "notación de unión implícita". La "notación de unión implícita" ya no se considera una mejor práctica [ ¿por quién? ] , aunque los sistemas de bases de datos todavía lo admiten.

La "notación de unión explícita" utiliza la JOINpalabra clave, opcionalmente precedida por la INNERpalabra clave, para especificar la tabla a unir, y la ONpalabra clave para especificar los predicados de la unión, como en el siguiente ejemplo:

SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento ;           

La "notación de unión implícita" simplemente enumera las tablas para unir, en la FROMcláusula de la SELECTdeclaración, usando comas para separarlas. Por lo tanto, especifica una unión cruzada y la WHEREcláusula puede aplicar predicados de filtro adicionales (que funcionan de manera comparable a los predicados de unión en la notación explícita).

El siguiente ejemplo es equivalente al anterior, pero esta vez usando notación de unión implícita:

SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ;         

Las consultas dadas en los ejemplos anteriores unirán las tablas de Empleados y Departamentos usando la columna ID de Departamento de ambas tablas. Cuando el ID de departamento de estas tablas coincide (es decir, se cumple el predicado de unión), la consulta combinará las columnas Apellido , ID de departamento y Nombre de departamento de las dos tablas en una fila de resultados. Cuando el ID del departamento no coincide, no se genera ninguna fila de resultados.

Así el resultado de la ejecución de la consulta anterior será:

El empleado "Williams" y el departamento "Marketing" no aparecen en los resultados de la ejecución de la consulta. Ninguno de estos tiene filas coincidentes en la otra tabla respectiva: "Williams" no tiene ningún departamento asociado y ningún empleado tiene el ID de departamento 35 ("Marketing"). Dependiendo de los resultados deseados, este comportamiento puede ser un error sutil, que se puede evitar reemplazando la unión interna por una unión externa.

Unión interna y valores NULL

Los programadores deben tener especial cuidado al unir tablas en columnas que pueden contener valores NULL , ya que NULL nunca coincidirá con ningún otro valor (ni siquiera el propio NULL), a menos que la condición de unión utilice explícitamente un predicado de combinación que primero verifique que las columnas se unen NOT NULLantes de aplicar. las condiciones predicadas restantes. La unión interna solo se puede utilizar de forma segura en una base de datos que aplique integridad referencial o donde se garantice que las columnas de unión no serán NULL. Muchas bases de datos relacionales de procesamiento de transacciones se basan en estándares de actualización de datos de atomicidad, coherencia, aislamiento y durabilidad (ACID) para garantizar la integridad de los datos, lo que hace que las uniones internas sean una opción adecuada. Sin embargo, las bases de datos de transacciones generalmente también tienen columnas de unión deseables que pueden ser NULL. Muchas bases de datos relacionales y almacenes de datos de informes utilizan actualizaciones por lotes de extracción, transformación y carga (ETL) de gran volumen que hacen que la integridad referencial sea difícil o imposible de aplicar, lo que da como resultado columnas de unión potencialmente NULL que un autor de una consulta SQL no puede modificar y que provocan que se omitan las uniones internas. datos sin indicación de error. La elección de utilizar una combinación interna depende del diseño de la base de datos y de las características de los datos. Una combinación externa izquierda generalmente se puede sustituir por una combinación interna cuando las columnas de combinación en una tabla pueden contener valores NULL.

Cualquier columna de datos que pueda ser NULL (vacía) nunca debe usarse como enlace en una combinación interna, a menos que el resultado deseado sea eliminar las filas con el valor NULL. Si las columnas de unión NULL se van a eliminar deliberadamente del conjunto de resultados , una unión interna puede ser más rápida que una unión externa porque la unión de la tabla y el filtrado se realizan en un solo paso. Por el contrario, una unión interna puede provocar un rendimiento desastrosamente lento o incluso una caída del servidor cuando se utiliza en una consulta de gran volumen en combinación con funciones de base de datos en una cláusula Where de SQL. [2] [3] [4] Una función en una cláusula Where de SQL puede hacer que la base de datos ignore índices de tablas relativamente compactos. La base de datos puede leer y unir internamente las columnas seleccionadas de ambas tablas antes de reducir el número de filas usando el filtro que depende de un valor calculado, lo que resulta en una cantidad relativamente enorme de procesamiento ineficiente.

Cuando se produce un conjunto de resultados uniendo varias tablas, incluidas las tablas maestras utilizadas para buscar descripciones de texto completo de códigos de identificador numérico (una tabla de búsqueda ), un valor NULL en cualquiera de las claves externas puede provocar que se elimine toda la fila. del conjunto de resultados, sin indicación de error. Una consulta SQL compleja que incluye una o más combinaciones internas y varias combinaciones externas tiene el mismo riesgo de valores NULL en las columnas de enlace de combinación interna.

Un compromiso con el código SQL que contiene uniones internas supone que las columnas de unión NULL no serán introducidas por cambios futuros, incluidas actualizaciones de proveedores, cambios de diseño y procesamiento masivo fuera de las reglas de validación de datos de la aplicación, como conversiones de datos, migraciones, importaciones masivas y fusiones.

Además, se pueden clasificar las uniones internas como uniones equiuniones, uniones naturales o uniones cruzadas.

unión equivalente

Una combinación equi es un tipo específico de combinación basada en comparador, que utiliza solo comparaciones de igualdad en el predicado de combinación. El uso de otros operadores de comparación (como <) descalifica una unión como equi-unión. La consulta que se muestra arriba ya ha proporcionado un ejemplo de unión equivalente:

SELECCIONAR * DEL empleado UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;        

Podemos escribir equi-join como se muestra a continuación,

SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ;      

Si las columnas de una combinación equi tienen el mismo nombre, SQL-92 proporciona una notación abreviada opcional para expresar combinaciones equi, mediante la USINGconstrucción: [5]

SELECCIONAR * DEL empleado INNER JOIN departamento USANDO ( DepartamentoID );       

Sin embargo, la USINGconstrucción es más que un mero azúcar sintáctico , ya que el conjunto de resultados difiere del conjunto de resultados de la versión con el predicado explícito. Específicamente, cualquier columna mencionada en la USINGlista aparecerá solo una vez, con un nombre no calificado, en lugar de una vez para cada tabla de la combinación. En el caso anterior, habrá una sola DepartmentIDcolumna y no employee.DepartmentIDhabrá ni department.DepartmentID.

La USINGcláusula no es compatible con MS SQL Server y Sybase.

unión natural

La unión natural es un caso especial de unión equi. La unión natural (⋈) es un operador binario que se escribe como ( RS ) donde R y S son relaciones . [6] El resultado de la unión natural es el conjunto de todas las combinaciones de tuplas en R y S que son iguales en sus nombres de atributos comunes. Como ejemplo, considere las tablas Empleado y Departamento y su combinación natural:

Esto también se puede utilizar para definir la composición de las relaciones . Por ejemplo, la composición de Empleado y Departamento es su combinación como se muestra arriba, proyectada en todos menos en el atributo común NombreDepto . En la teoría de categorías , la unión es precisamente el producto de fibra .

La unión natural es posiblemente uno de los operadores más importantes ya que es la contraparte relacional del AND lógico. Tenga en cuenta que si la misma variable aparece en cada uno de dos predicados conectados por AND, entonces esa variable representa lo mismo y ambas apariciones siempre deben sustituirse por el mismo valor. En particular, la unión natural permite la combinación de relaciones que están asociadas mediante una clave foránea . Por ejemplo, en el ejemplo anterior probablemente exista una clave externa de Empleado . NombreDepto al Departamento . DeptName y luego la unión natural de Empleado y Departamento combina a todos los empleados con sus departamentos. Esto funciona porque la clave externa se mantiene entre atributos con el mismo nombre. Si este no es el caso, como en la clave externa del Departamento . gerente a empleado . Nombre , entonces estas columnas deben cambiarse de nombre antes de que se tome la unión natural. A veces, esta unión también se denomina unión equi .

Más formalmente, la semántica de la unión natural se define de la siguiente manera:

,

donde Fun es un predicado que es verdadero para una relación r si y sólo si r es una función. Generalmente se requiere que R y S tengan al menos un atributo común, pero si se omite esta restricción y R y S no tienen atributos comunes, entonces la unión natural se convierte exactamente en el producto cartesiano.

La unión natural se puede simular con las primitivas de Codd de la siguiente manera. Sean c 1 , ..., cm los nombres de atributos comunes a R y S , r 1 , ..., r n los nombres de atributos únicos de R y sean s 1 , ..., s k los atributos exclusivo de S. Además, supongamos que los nombres de los atributos x 1 , ..., x m no están ni en R ni en S . En un primer paso, ahora se pueden cambiar los nombres de los atributos comunes en S :

Luego tomamos el producto cartesiano y seleccionamos las tuplas que se van a unir:

Una unión natural es un tipo de unión equivalente en la que el predicado de unión surge implícitamente al comparar todas las columnas de ambas tablas que tienen los mismos nombres de columna en las tablas unidas. La tabla unida resultante contiene solo una columna para cada par de columnas con el mismo nombre. En el caso de que no se encuentren columnas con los mismos nombres, el resultado es una unión cruzada .

La mayoría de los expertos coinciden en que los NATURAL JOIN son peligrosos y, por tanto, desaconsejan su uso. [7] El peligro proviene de agregar inadvertidamente una nueva columna, con el mismo nombre que otra columna en la otra tabla. Una unión natural existente podría entonces usar "naturalmente" la nueva columna para comparaciones, haciendo comparaciones/coincidencias usando criterios diferentes (de diferentes columnas) que antes. Por lo tanto, una consulta existente podría producir resultados diferentes, incluso aunque los datos de las tablas no hayan sido modificados, sino sólo aumentados. El uso de nombres de columnas para determinar automáticamente los vínculos de las tablas no es una opción en bases de datos grandes con cientos o miles de tablas, donde impondría una restricción poco realista a las convenciones de nomenclatura. Las bases de datos del mundo real se diseñan comúnmente con datos de clave externa que no se completan de manera consistente (se permiten valores NULL), debido a las reglas comerciales y al contexto. Es una práctica común modificar los nombres de las columnas de datos similares en diferentes tablas y esta falta de coherencia rígida relega las uniones naturales a un concepto teórico de discusión.

La consulta de ejemplo anterior para uniones internas se puede expresar como una unión natural de la siguiente manera:

SELECCIONAR * DEL departamento NATURAL JOIN del empleado ;     

Al igual que con la USINGcláusula explícita, solo aparece una columna DepartmentID en la tabla unida, sin ningún calificador:

PostgreSQL, MySQL y Oracle admiten uniones naturales; Microsoft T-SQL e IBM DB2 no lo hacen. Las columnas utilizadas en la combinación son implícitas, por lo que el código de combinación no muestra qué columnas se esperan y un cambio en los nombres de las columnas puede cambiar los resultados. En el estándar SQL:2011 , las uniones naturales son parte del paquete opcional F401, "Tabla unida extendida".

En muchos entornos de bases de datos, los nombres de las columnas los controla un proveedor externo, no el desarrollador de la consulta. Una unión natural supone estabilidad y coherencia en los nombres de las columnas, que pueden cambiar durante las actualizaciones de versión exigidas por el proveedor.

unión externa

La tabla unida conserva cada fila, incluso si no existe otra fila coincidente. Las uniones externas se subdividen en uniones externas izquierdas, uniones externas derechas y uniones externas completas, según las filas de la tabla que se conserven: izquierda, derecha o ambas (en este caso, izquierda y derecha se refieren a los dos lados de la JOINpalabra clave). Al igual que las uniones internas, se pueden subcategorizar aún más todos los tipos de uniones externas como uniones equi, uniones naturales ( θ -join ), etc. [8]ON <predicate>

No existe ninguna notación de unión implícita para uniones externas en SQL estándar.

Un diagrama de Venn que muestra el círculo izquierdo y la parte superpuesta llena.
Un diagrama de Venn que representa la instrucción SQL de unión izquierda entre las tablas A y B.

Izquierda combinación externa

El resultado de una unión externa izquierda (o simplemente unión izquierda ) para las tablas A y B siempre contiene todas las filas de la tabla "izquierda" (A), incluso si la condición de unión no encuentra ninguna fila coincidente en la tabla "derecha" (B). Esto significa que si la ONcláusula coincide con 0 (cero) filas en B (para una fila determinada en A), la combinación aún devolverá una fila en el resultado (para esa fila), pero con NULL en cada columna de B. A izquierda la combinación externa devuelve todos los valores de una combinación interna más todos los valores de la tabla de la izquierda que no coinciden con la tabla de la derecha, incluidas las filas con valores NULL (vacíos) en la columna de enlace.

Por ejemplo, esto nos permite encontrar el departamento de un empleado, pero aún muestra los empleados que no han sido asignados a un departamento (a diferencia del ejemplo de unión interna anterior, donde los empleados no asignados fueron excluidos del resultado).

Ejemplo de una combinación externa izquierda (la OUTERpalabra clave es opcional), con la fila de resultado adicional (en comparación con la combinación interna) en cursiva:

SELECCIONAR * DEL empleado IZQUIERDO EXTERIOR UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;          

Sintaxis alternativas

Oracle admite la sintaxis obsoleta [9] :

SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento = departamento . ID de departamento ( + )      

Sybase admite la sintaxis ( Microsoft SQL Server desaprobó esta sintaxis desde la versión 2000):

SELECCIONE * DEL empleado , departamento DONDE empleado . IDDepartamento *= departamento . ID de departamento      

IBM Informix soporta la sintaxis:

SELECCIONE * DEL empleado , departamento EXTERNO DONDE empleado . IDDepartamento = departamento . ID de departamento       
Un diagrama de Venn muestra el círculo derecho y las partes superpuestas llenas.
Un diagrama de Venn que representa la instrucción SQL de unión correcta entre las tablas A y B.

Unión exterior derecha

Una combinación exterior derecha (o combinación derecha ) se parece mucho a una combinación exterior izquierda, excepto que el tratamiento de las tablas se invierte. Cada fila de la tabla "derecha" (B) aparecerá en la tabla unida al menos una vez. Si no existe ninguna fila coincidente de la tabla "izquierda" (A), aparecerá NULL en las columnas de A para aquellas filas que no coincidan en B.

Una combinación externa derecha devuelve todos los valores de la tabla derecha y los valores coincidentes de la tabla izquierda (NULL en el caso de que no haya un predicado de combinación coincidente). Por ejemplo, esto nos permite encontrar cada empleado y su departamento, pero aún así mostrar los departamentos que no tienen empleados.

A continuación se muestra un ejemplo de una combinación externa derecha (la OUTERpalabra clave es opcional), con la fila de resultados adicional en cursiva:

SELECCIONAR * DEL empleado DERECHO EXTERNO UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;          

Las uniones exteriores derecha e izquierda son funcionalmente equivalentes. Ninguno proporciona ninguna funcionalidad que el otro no ofrece, por lo que las uniones externas derecha e izquierda pueden reemplazarse entre sí siempre que se cambie el orden de la tabla.

Un diagrama de Venn que muestra el círculo derecho, el círculo izquierdo y la parte superpuesta llena.
Un diagrama de Venn que representa la declaración SQL de unión completa entre las tablas A y B.

Unión exterior completa

Conceptualmente, una unión exterior completa combina el efecto de aplicar uniones exteriores izquierda y derecha. Cuando las filas de las tablas unidas externas completas no coinciden, el conjunto de resultados tendrá valores NULL para cada columna de la tabla que carezca de una fila coincidente. Para aquellas filas que coincidan, se generará una sola fila en el conjunto de resultados (que contiene columnas completadas de ambas tablas).

Por ejemplo, esto nos permite ver cada empleado que está en un departamento y cada departamento que tiene un empleado, pero también ver cada empleado que no es parte de un departamento y cada departamento que no tiene un empleado.

Ejemplo de unión externa completa (la OUTERpalabra clave es opcional):

SELECCIONAR * DEL empleado COMPLETO EXTERIOR UNIRSE al departamento DEL empleado . IDDepartamento = departamento . ID de departamento ;          

Algunos sistemas de bases de datos no admiten directamente la funcionalidad de combinación externa completa, pero pueden emularla mediante el uso de una combinación interna y UNION ALL selecciona las "filas de tabla únicas" de las tablas izquierda y derecha respectivamente. El mismo ejemplo puede aparecer de la siguiente manera:

SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento , departamento . ID de departamento DEL empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento           UNIÓN TODOS SELECCIONAR empleado . Apellido , empleado . IDDepartamento , emitir ( NULL como varchar ( 20 ) ) , emitir ( NULL como entero ) DESDE empleado DONDE NO EXISTE ( SELECCIONAR * DESDE departamento DONDE empleado . IDDepartamento = departamento.IDDepartamento )                    UNIÓN TODOS SELECCIONE conversión ( NULL como varchar ( 20 )), conversión ( NULL como entero ), departamento . NombreDepartamento , departamento . IDDepartamento DEL departamento DONDE NO EXISTE ( SELECCIONAR * DEL empleado DONDE empleado.IDDepartamento = departamento.IDDepartamento ) _ _ _ _                    

Otro enfoque podría ser UNION ALL de la unión exterior izquierda y la unión exterior derecha MENOS la unión interior.

Autounirse

Una autounión es unir una mesa a sí misma. [10]

Ejemplo

Si hubiera dos tablas separadas para empleados y una consulta que solicitara que los empleados de la primera tabla tuvieran el mismo país que los empleados de la segunda tabla, se podría utilizar una operación de unión normal para encontrar la tabla de respuestas. Sin embargo, toda la información de los empleados está contenida en una única tabla grande. [11]

Considere una tabla modificada Employeecomo la siguiente:

Una consulta de solución de ejemplo podría ser la siguiente:

SELECCIONE F. _ ID de empleado , F. Apellidos . _ _ ID de empleado , S. Apellido , F. _ País DESDE Empleado F INNER JOIN Empleado S ON F . País = S . País DONDE F . ID de empleado < S . ID de empleado ORDEN POR F . ID de empleado , S. ID de empleado ;                     

Lo que da como resultado que se genere la siguiente tabla.

Para este ejemplo:

Sólo se necesita uno de los dos pares del medio para satisfacer la pregunta original, y el superior y el inferior no tienen ningún interés en este ejemplo.

Alternativas

El efecto de una unión externa también se puede obtener usando UNION ALL entre una INNER JOIN y un SELECT de las filas de la tabla "principal" que no cumplen la condición de unión. Por ejemplo,

SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento DEL empleado IZQUIERDO EXTERIOR ÚNETE al departamento EN empleado . IDDepartamento = departamento . ID de departamento ;           

también se puede escribir como

SELECCIONAR empleado . Apellido , empleado . IDDepartamento , departamento . NombreDepartamento FROM empleado INNER JOIN departamento ON empleado . IDDepartamento = departamento . ID de departamento          UNIÓN TODOS SELECCIONAR empleado . Apellido , empleado . IDDepartamento , emitido ( NULL como varchar ( 20 )) DEL empleado DONDE NO EXISTE ( SELECCIONE * DEL departamento DONDE empleado . IDDepartamento = departamento . IDDepartamento )                 

Implementación

Dos posibles planes de consulta para la consulta triangular R(A, B) ⋈ S(B, C) ⋈ T(A, C) ; el primero une S y T primero y une el resultado con R , el segundo une R y S primero y une el resultado con T

Gran parte del trabajo en sistemas de bases de datos se ha dirigido a la implementación eficiente de uniones, porque los sistemas relacionales comúnmente requieren uniones, pero enfrentan dificultades para optimizar su ejecución eficiente. El problema surge porque las uniones internas operan tanto de forma conmutativa como asociativa . En la práctica, esto significa que el usuario simplemente proporciona la lista de tablas para unirse y las condiciones de unión a usar, y el sistema de base de datos tiene la tarea de determinar la forma más eficiente de realizar la operación. Un optimizador de consultas determina cómo ejecutar una consulta que contiene combinaciones. Un optimizador de consultas tiene dos libertades básicas:

  1. Orden de unión : debido a que une funciones de forma conmutativa y asociativa, el orden en el que el sistema une las tablas no cambia el conjunto de resultados final de la consulta. Sin embargo, el orden de unión podría tener un impacto enorme en el costo de la operación de unión, por lo que elegir el mejor orden de unión se vuelve muy importante.
  2. Método de unión : dadas dos tablas y una condición de unión, varios algoritmos pueden producir el conjunto de resultados de la unión. El algoritmo que se ejecuta de forma más eficiente depende de los tamaños de las tablas de entrada, el número de filas de cada tabla que coinciden con la condición de unión y las operaciones requeridas por el resto de la consulta.

Muchos algoritmos de unión tratan sus entradas de manera diferente. Se puede hacer referencia a las entradas de una combinación como operandos de combinación "exterior" e "interior", o "izquierda" y "derecha", respectivamente. En el caso de bucles anidados, por ejemplo, el sistema de base de datos escaneará toda la relación interna en busca de cada fila de la relación externa.

Se pueden clasificar los planes de consulta que involucran uniones de la siguiente manera: [12]

profundo a la izquierda
usar una tabla base (en lugar de otra combinación) como operando interno de cada combinación en el plan
muy profundo
usar una tabla base como operando externo de cada unión en el plan
tupido
ni a la izquierda ni a la derecha; Ambas entradas a una combinación pueden resultar de combinaciones.

Estos nombres se derivan de la apariencia del plan de consulta si se dibuja como un árbol , con la relación de unión externa a la izquierda y la relación interna a la derecha (como dicta la convención).

Unir algoritmos

Una ilustración de las propiedades de los algoritmos de unión. Cuando se realiza una unión entre más de dos relaciones en más de dos atributos, los algoritmos de unión binaria, como la unión hash , operan sobre dos relaciones a la vez y las unen en todos los atributos en la condición de unión; Los algoritmos óptimos en el peor de los casos, como la unión genérica, operan en un solo atributo a la vez, pero unen todas las relaciones en este atributo. [13]

Existen tres algoritmos fundamentales para realizar una operación de unión binaria: unión de bucle anidado , unión de clasificación y fusión y unión hash . Los algoritmos de unión óptima en el peor de los casos son asintóticamente más rápidos que los algoritmos de unión binaria para uniones entre más de dos relaciones en el peor de los casos .

Unirse a índices

Los índices de unión son índices de bases de datos que facilitan el procesamiento de consultas de unión en almacenes de datos : actualmente (2012) están disponibles en implementaciones de Oracle [14] y Teradata . [15]

En la implementación de Teradata, las columnas especificadas, las funciones agregadas en columnas o los componentes de columnas de fecha de una o más tablas se especifican usando una sintaxis similar a la definición de una vista de base de datos : se pueden especificar hasta 64 columnas/expresiones de columna en una sola unirse al índice. Opcionalmente, también se puede especificar una columna que defina la clave principal de los datos compuestos: en hardware paralelo, los valores de la columna se utilizan para particionar el contenido del índice en varios discos. Cuando los usuarios actualizan las tablas de origen de forma interactiva, el contenido del índice de combinación se actualiza automáticamente. Cualquier consulta cuya cláusula WHERE especifique cualquier combinación de columnas o expresiones de columnas que sean un subconjunto exacto de las definidas en un índice de combinación (la llamada "consulta de cobertura") hará que el índice de combinación, en lugar de las tablas originales y sus índices, para ser consultado durante la ejecución de la consulta.

La implementación de Oracle se limita a utilizar índices de mapas de bits . Se utiliza un índice de unión de mapa de bits para columnas de baja cardinalidad (es decir, columnas que contienen menos de 300 valores distintos, según la documentación de Oracle): combina columnas de baja cardinalidad de múltiples tablas relacionadas. El ejemplo que utiliza Oracle es el de un sistema de inventario, donde diferentes proveedores proporcionan diferentes piezas. El esquema tiene tres tablas vinculadas: dos "tablas maestras", Pieza y Proveedor, y una "tabla de detalles", Inventario. La última es una tabla de muchos a muchos que vincula al proveedor con la pieza y contiene la mayor cantidad de filas. Cada pieza tiene un tipo de pieza, cada proveedor tiene su sede en EE. UU. y tiene una columna de estado. No hay más de 60 estados y territorios en los EE. UU. y no más de 300 tipos de piezas. El índice de unión de mapa de bits se define utilizando una unión estándar de tres tablas en las tres tablas anteriores y especificando las columnas Part_Type y Supplier_State para el índice. Sin embargo, se define en la tabla Inventario, aunque las columnas Tipo_Parte y Estado_Proveedor están "prestadas" del Proveedor y Parte respectivamente.

En cuanto a Teradata, un índice de unión de mapa de bits de Oracle solo se utiliza para responder una consulta cuando la cláusula WHERE de la consulta especifica columnas limitadas a aquellas que están incluidas en el índice de unión.

unión directa

Algunos sistemas de bases de datos permiten al usuario forzar al sistema a leer las tablas de una combinación en un orden particular. Esto se utiliza cuando el optimizador de combinaciones elige leer las tablas en un orden ineficiente. Por ejemplo, en MySQL el comando STRAIGHT_JOINlee las tablas exactamente en el orden que figura en la consulta. [dieciséis]

Ver también

Referencias

Citas

  1. ^ UNIÓN CRUZADA DE SQL
  2. ^ Greg Robidoux, "Evite las funciones de SQL Server en la cláusula WHERE para rendimiento", Consejos de MSSQL, 3 de mayo de 2007
  3. ^ Patrick Wolf, "Dentro de Oracle APEX" Precaución al utilizar funciones PL/SQL en una declaración SQL ", 30 de noviembre de 2006
  4. ^ Gregory A. Larsen, "Mejores prácticas de T-SQL: no utilice funciones de valor escalar en la lista de columnas o cláusulas WHERE", 29 de octubre de 2009.
  5. ^ Simplificación de uniones con la palabra clave USING
  6. ^ En Unicode , el símbolo de la pajarita es ⋈ (U+22C8).
  7. ^ Pregúntele a Tom "Se une el soporte de Oracle a ANSI". Regreso a lo básico: uniones internas »Blog de Eddie Awad Archivado el 19 de noviembre de 2010 en Wayback Machine.
  8. ^ Silberschatz, Abraham ; Korth, Hank ; Sudarshan, S. (2002). "Sección 4.10.2: Tipos y condiciones de unión". Conceptos del sistema de bases de datos (4ª ed.). McGraw-Hill. pag. 166.ISBN _ 0072283637.
  9. ^ Unión exterior izquierda de Oracle
  10. ^ Shah 2005, pag. 165
  11. ^ Adaptado de Pratt 2005, págs. 115–6
  12. ^ Yu y Meng 1998, pág. 213
  13. ^ Wang, Yisu Remy; Willsey, Max; Suciu, Dan (27 de enero de 2023). "Únase libre: unificación de uniones tradicionales y óptimas en el peor de los casos". arXiv : 2301.10841 [cs.DB].
  14. ^ Índice de unión de mapas de bits de Oracle. URL: http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm
  15. ^ Índices de unión de Teradata. "Únete al índice". Archivado desde el original el 16 de diciembre de 2012 . Consultado el 14 de junio de 2012 .
  16. ^ "13.2.9.2 Sintaxis JOIN". Manual de referencia de MySQL 5.7 . Corporación Oráculo . Consultado el 3 de diciembre de 2015 .

Fuentes

enlaces externos