stringtranslate.com

Unión hash

La unión hash es un ejemplo de un algoritmo de unión y se utiliza en la implementación de un sistema de gestión de bases de datos relacionales . Todas las variantes de los algoritmos de unión hash implican la creación de tablas hash a partir de las tuplas de una o ambas relaciones unidas y, posteriormente, el sondeo de esas tablas de modo que solo sea necesario comparar las tuplas con el mismo código hash para determinar su igualdad en las uniones equi.

Las uniones hash suelen ser más eficientes que las uniones de bucles anidados, excepto cuando el lado de sondeo de la unión es muy pequeño. Requieren un predicado de unión equitativa (un predicado que compara registros de una tabla con los de la otra tabla utilizando una conjunción de operadores de igualdad '=' en una o más columnas).

Unión hash clásica

El algoritmo clásico de unión hash para una unión interna de dos relaciones procede de la siguiente manera:

La primera fase se suele denominar fase de "construcción" , mientras que la segunda se denomina fase de "prueba" . De manera similar, la relación de unión sobre la que se construye la tabla hash se denomina entrada de "construcción", mientras que la otra entrada se denomina entrada de "prueba".

Este algoritmo es simple, pero requiere que la relación de unión más pequeña quepa en la memoria, lo que a veces no sucede. Un enfoque simple para manejar esta situación es el siguiente:

  1. Para cada tupla en la entrada de compilación
    1. Agregar a la tabla hash en memoria
    2. Si el tamaño de la tabla hash es igual al tamaño máximo en memoria:
      1. Escanee la entrada de la sonda y agregue tuplas de unión coincidentes a la relación de salida
      2. Restablezca la tabla hash y continúe escaneando la entrada de compilación
  2. Realice un escaneo final de la entrada de la sonda y agregue las tuplas de unión resultantes a la relación de salida.

En esencia, esto es lo mismo que el algoritmo de unión de bucles anidados en bloques . Este algoritmo puede escanear más veces de las necesarias.

Unión hash de gracia

Un enfoque mejor se conoce como "unión hash de gracia", en honor a la máquina de base de datos GRACE para la que se implementó por primera vez.

Este algoritmo evita volver a escanear toda la relación al particionar primero tanto y mediante una función hash, y escribir estas particiones en el disco. Luego, el algoritmo carga pares de particiones en la memoria, crea una tabla hash para la relación particionada más pequeña y sondea la otra relación para encontrar coincidencias con la tabla hash actual. Debido a que las particiones se formaron mediante el hash de la clave de unión, debe darse el caso de que todas las tuplas de salida de la unión pertenezcan a la misma partición.

Es posible que una o más de las particiones aún no quepan en la memoria disponible, en cuyo caso el algoritmo se aplica de forma recursiva: se elige una función hash ortogonal adicional para dividir la partición grande en subparticiones, que luego se procesan como antes. Como esto es costoso, el algoritmo intenta reducir la posibilidad de que esto ocurra formando las particiones más pequeñas posibles durante la fase de partición inicial.

Unión hash híbrida

El algoritmo de unión hash híbrida [1] es una combinación de la unión hash clásica y la unión hash de gracia. Utiliza una cantidad mínima de memoria para la partición como en la unión hash de gracia y utiliza la memoria restante para inicializar una unión hash clásica durante la fase de partición. Durante la fase de partición, la unión hash híbrida utiliza la memoria disponible para dos propósitos:

  1. Para particionar ambas relaciones y
  2. Para mantener una partición completa en la memoria, conocida como "partición 0"

Debido a que la partición 0 nunca se escribe en el disco, la unión hash híbrida normalmente realiza menos operaciones de E/S que la unión hash de gracia. Cuando se ajusta casi por completo a la memoria, la unión hash híbrida tiene un comportamiento similar al de la unión hash clásica, lo que resulta más beneficioso. De lo contrario, la unión hash híbrida imita la unión hash de gracia.

Tenga en cuenta que este algoritmo es sensible a la memoria, porque hay dos demandas de memoria en competencia (la tabla hash para la partición 0 y los buffers de salida para las particiones restantes). Elegir una tabla hash demasiado grande para la partición 0 puede provocar que el algoritmo se repita porque una de las particiones distintas de cero es demasiado grande para caber en la memoria.

Anti-unión de hash

Las uniones hash también se pueden evaluar para un predicado anti-join (un predicado que selecciona valores de una tabla cuando no se encuentran valores relacionados en la otra). Según los tamaños de las tablas, se pueden aplicar diferentes algoritmos:

Hash izquierda anti-join

Esto es más eficiente cuando la tabla NOT IN es más pequeña que la tabla FROM .

Hash derecho anti-join

Esto es más eficiente cuando la tabla NOT IN es más grande que la tabla FROM .

Semi-unión hash

La unión semi-hash se utiliza para devolver los registros encontrados en la otra tabla. A diferencia de la unión simple, devuelve cada registro coincidente de la tabla principal solo una vez, independientemente de cuántas coincidencias haya en la tabla IN .

Al igual que la antiunión, la semiunión también puede ser izquierda y derecha:

Hash izquierda semi-unión

Los registros se devuelven inmediatamente después de que se produce un resultado. Los registros reales de la tabla hash se ignoran.

Esto es más eficiente cuando la tabla IN es más pequeña que la tabla FROM .

Unión semi-hash derecha

Con este algoritmo, cada registro de la tabla hash (es decir, la tabla FROM ) solo se puede devolver una vez, ya que se elimina después de ser devuelto.

Esto es más eficiente cuando la tabla IN es más grande que la tabla FROM .

Véase también

Referencias

  1. ^ DeWitt, DJ; Katz, R.; Olken, F.; Shapiro, L.; Stonebraker, M.; Wood, D. (junio de 1984). "Técnicas de implementación para sistemas de bases de datos en memoria principal". Proc. ACM SIGMOD Conf . 14 (4): 1–8. doi :10.1145/971697.602261.

Enlaces externos