sql >> Base de Datos >  >> RDS >> Oracle

Hash join en Oracle con ejemplo

Índice

  • ¿Qué es hash Join en Oracle?
  • Algoritmo para Oracle Hash Join
  • Ejemplo de unión hash de Oracle:
  • sugerencia de unión hash de Oracle 
  • Algunos puntos importantes sobre la unión hash en Oracle
  • Diferencia entre bucle anidado y unión hash

¿Qué es hash Join en Oracle?

Las uniones hash se utilizan cuando se unen tablas grandes o cuando las uniones requieren la mayoría de las filas de las tablas unidas. Esto se usa solo para uniones de igualdad

Algoritmo para Oracle Hash Join

1) El optimizador usa la más pequeña de las 2 tablas para construir una tabla hash en la memoria. La tabla pequeña se llama tabla de construcción

Fase de construcción

Para cada fila en el bucle de tabla pequeña
Calcular el valor hash en la clave de unión
Insertar fila en el cubo hash apropiado.
Finalizar bucle;

2) luego escanea las tablas grandes y compara el valor hash (de las filas de la tabla grande) con esta tabla hash para encontrar las filas unidas. La tabla grande se llama tabla de sondeo

Fase de sondeo

Para cada fila en el bucle de la tabla grande
Calcular el valor hash en la clave de combinación
Sondear la tabla hash para el valor hash
Si se encuentra una coincidencia
Devolver filas
Finalizar bucle;

La explicación anterior es cierta cuando la tabla hash que se está desarrollando cabe completamente en la memoria. Si la tabla hash es demasiado grande para caber en la memoria disponible, entonces Oracle realiza el procesamiento de una manera un poco diferente.
Básicamente, si la tabla hash es demasiado grande para caber en la memoria disponible Oracle tiene un mecanismo para guardarlo en el disco en lotes (llamados particiones) y guardar la tabla de sondeo en el disco en lotes coincidentes, luego hacer la unión por partes entre lotes coincidentes

Básicamente, cuando el área hash se llena, Oracle requerirá usar el espacio de tablas TEMP. Oracle elegirá la partición más grande con el hash y la escribirá en TEMP. Oracle mantiene un índice similar a un mapa de bits de toda la tabla hash en la memoria. Este índice solo sabe que para un cubo hash dado (ubicación en la tabla hash) hay o no hay un valor. Pero el índice no tiene el valor real.

Por lo tanto, si una fila de la segunda tabla o de la tabla de prueba se convierte en hash en una de estas ubicaciones, lo único que se sabe es que existe una coincidencia potencial. El proceso de creación de la tabla hash continúa hasta que se completa toda la tabla hash. Parte de la tabla hash está en la memoria y una parte está en el disco

Ahora, Oracle comienza a leer la sonda u otra tabla y comienza a crear el hash de la clave de unión. Si la clave hash coincide con el hash en la memoria, la unión se completa y se devuelve la fila. Si la fila es la coincidencia potencial, entonces Oracle almacenará esta fila en el tablespace TEMP en el mismo esquema de particionamiento en el que se mantuvieron los datos de la primera fila.

Una vez que se realiza el primer paso de toda la tabla secundaria y se dan todas las filas en la tabla hash en la memoria, Oracle comenzará a buscar la partición correspondiente en el disco y procesará cada partición una por una y leerá las filas en la memoria. y procesar la salida

Ejemplo de combinación hash de Oracle:

select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
Plan
-------------------------------------------------
SELECT STATEMENT
HASH JOIN
TABLE ACCESS FULL EMP
TABLE ACCESS FULL DEPT

Cómo se procesa la combinación Hash en Oracle
1) La primera tabla EMP se escanea y se aplica un hash
2) la tabla de departamento se escanea para cada fila y se crea un hash para la unión manteniendo dept_no
3) el hash dept_no coincide con la tabla hash , si se encuentra una coincidencia, se devuelven las filas unidas

sugerencia de unión hash de Oracle 

Oracle ha proporcionado la sugerencia use_hash para forzar el uso de hash join.

Usage

select /* +use_hash(table alias) */ ......

Esto le dice al optimizador que el método de combinación que se usará cuando "table_alias" sea la fuente de la siguiente fila en el orden de combinación debe ser una combinación hash; sin embargo, no le dice al optimizador si ese origen de fila debe usarse como tabla de construcción o como tabla de sondeo.

Para especificar cómo se usa el origen de la fila, necesita una segunda sugerencia:no_swap_join_inputs(“table_alias”) si desea que Oracle use el origen de la fila como tabla de sondeo, o swap_join_inputs(“table_alias”) si desea que Oracle lo use como la compilación mesa

Algunos puntos importantes sobre hash join en Oracle

1) La salida del resultado de la unión hash no es instantánea, ya que la unión hash se bloquea al construir la tabla hash. Una vez que se completa la creación de la tabla hash, las filas se devuelven más rápido
2) Las uniones hash se ven comúnmente con el optimizador ALL_ROWS modo, porque funciona en el modelo de mostrar resultados después de que todas las filas de al menos una de las tablas se hayan convertido en hash en la tabla hash.
3) La tabla hash es la memoria privada, por lo que el acceso a los datos no genera mucha actividad de bloqueo

Coste del hash Join =Costo de la lectura de la tabla A + costo de la lectura de la tabla B + algún pequeño procesamiento en memoria

Diferencia entre bucle anidado y unión hash

Unión hash Unión anidada
Las uniones hash se utilizan cuando se unen tablas grandes o cuando las uniones requieren la mayoría de las filas de las tablas unidas. Esto se usa solo para uniones de igualdad La unión de BUCLES NESTED es una operación de unión que selecciona una fila de la fuente de fila inicial seleccionada y utiliza los valores de esta fuente de fila para conducir o seleccionar desde la fuente de fila unida en busca de la fila coincidente.
-Mejor para transacciones de tipo OLTP
La operación hash normalmente es eficiente para los dos conjuntos de datos cuando se devuelven muchos registros. Cuando un conjunto de datos no tiene o tiene un número pequeño de registros devueltos y otro conjunto de datos se puede comparar mediante la operación de índice, entonces la unión de bucle anidado es más eficiente
Es posible que vea que se utilizan más combinaciones hash con el modo optimizador ALL_ROWS, porque funciona en el modelo de mostrar resultados después de que todas las filas de al menos una de las tablas se hayan convertido en hash en la tabla hash. Verá un mayor uso del bucle anidado cuando use el modo de optimización FIRST_ROWS, ya que funciona en el modelo de mostrar resultados instantáneos al usuario a medida que se recuperan. No es necesario seleccionar el almacenamiento en caché de ningún dato antes de devolverlo al usuario. En caso de combinación hash, es necesaria y se explica a continuación.