2009-07-10 17 views

Respuesta

60

Una unión "sort merge" se realiza ordenando los dos conjuntos de datos que se unirán de acuerdo con las claves de combinación y luego combinándolos. La fusión es muy barata, pero el tipo puede ser prohibitivamente caro, especialmente si el género se derrama en el disco. El costo del tipo puede reducirse si se puede acceder a uno de los conjuntos de datos en orden ordenado mediante un índice, aunque acceder a una gran proporción de bloques de una tabla mediante un escaneo de índice también puede ser muy costoso en comparación con un escaneo completo de tabla .

Una combinación de hash se realiza mezclando un conjunto de datos en la memoria en base a columnas de unión y leyendo el otro y probando la tabla de mezcla para buscar coincidencias. La combinación de hash es de muy bajo costo cuando la tabla de hash se puede mantener por completo en la memoria, con un costo total que asciende a muy poco más que el costo de leer los conjuntos de datos. El costo aumenta si la tabla hash tiene que ser derramada en el disco en una clasificación de una sola pasada, y aumenta considerablemente para una ordenación multipaso.

El costo de una combinación hash se puede reducir mediante la partición de ambas tablas en la (s) clave (s) de unión. Esto permite que el optimizador infiera que las filas de una partición en una tabla solo encontrarán una coincidencia en una partición particular de la otra tabla, y para las tablas que tienen n particiones la unión hash se ejecuta como n combinaciones de hash independientes. Esto tiene los siguientes efectos:

  1. Se reduce el tamaño de cada tabla hash, por lo tanto, se reduce la cantidad máxima de memoria necesaria y se elimina la necesidad de que la operación requiera espacio temporal en el disco.
  2. Para operaciones de consulta en paralelo, la cantidad de mensajes entre procesos es muy reducida, lo que reduce el uso de la CPU y mejora el rendimiento, ya que cada combinación de hash se puede realizar mediante un par de procesos PQ.
  3. Para operaciones de consulta no paralelas, el requisito de memoria se reduce por un factor de n, y las primeras filas se proyectan desde la consulta anterior.

Debe tener en cuenta que las uniones hash solo se pueden usar para equi-uniones, pero las uniones fusionadas son más flexibles.

En general, si está uniendo grandes cantidades de datos en un equi-join, una combinación de hash va a ser una mejor opción.

Este tema está muy bien cubierto en la documentación.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

6

Solo quiero editar esto para la posteridad que las etiquetas para el oráculo no se agregaron cuando respondí esta pregunta. Mi respuesta fue más aplicable a MS SQL.

Merge join es lo mejor posible ya que explota la ordenación, lo que da como resultado un solo pase por las tablas para hacer la unión. SI tiene dos tablas (o índices que cubren) que hacen que su pedido sea el mismo, como una clave principal y un índice de una tabla en esa clave, se produciría una unión combinada si realizara esa acción.

La combinación Hash es la siguiente mejor, como suele hacerse cuando una tabla tiene un número pequeño (relativamente) de elementos, está creando efectivamente una tabla temporal con hashes para cada fila que luego se busca continuamente para crear la unión.

El peor caso es el bucle anidado que es orden (n * m) lo que significa que no hay orden o tamaño para explotar y la unión es simplemente, para cada fila en la tabla x, tabla de búsqueda y para las uniones.

+8

Si uno fuera siempre mejor que el otro, entonces el otro nunca sería usado, ¿no crees? Creo que la diferencia es más compleja que esto. –

+1

Perdón si me malinterpretaste. Estaba tratando de describir los tipos de uniones y por qué es mejor combinarlas. El problema es que merge join solo funciona si tiene un orden de clasificación para explotar y una combinación de hash solo es más eficiente cuando la tabla unida tiene una cantidad relativamente pequeña de filas. Disculpas si eso no estaba claro en la respuesta. – Spence

+0

Loops anidados es lo peor, por supuesto, cuando no es posible nada más. – Spence

Cuestiones relacionadas