Conceptos básicos del plan de ejecución: Hash Match Confusion


39

Estoy empezando a aprender los planes de ejecución y estoy confundido acerca de cómo funciona exactamente una coincidencia hash y por qué se usaría en una unión simple:

select Posts.Title, Users.DisplayName
From Posts JOIN Users on
Posts.OwnerUserId = Users.Id
OPTION (MAXDOP 1)

ingrese la descripción de la imagen aquí

Según tengo entendido, los resultados de la exploración de índice superior se convierten en hash y se busca cada fila en la exploración agrupada de índice inferior. Entiendo cómo funcionan las tablas hash al menos hasta cierto punto, pero estoy confundido acerca de qué valores se convierten exactamente en hash en un ejemplo como este.

Lo que tendría sentido para mí es que el campo común entre ellos, la identificación, está en hash, pero si este es el caso, ¿por qué hash un número?

Respuestas:


29

Como cita la respuesta de SQLRockstar

ideal para entradas grandes sin clasificar.

Ahora,

  • del escaneo del índice Users.DisplayName (se supone que no está agrupado) se obtiene Users.Id (suponiendo que está agrupado) = sin clasificar
  • También está escaneando publicaciones para OwnerUserId = sin clasificar

Esto es 2 entradas desordenadas.

Consideraría un índice en la tabla Publicaciones en OwnerUserId, incluido el Título. Esto agregará algún orden en un lado de la entrada a JOIN +, cubrirá el índice

CREATE INDEX IX_OwnerUserId ON Posts (OwnerUserId) INCLUDE (Title)

Entonces puede encontrar que el índice Users.DisplayName no se usará y escaneará la PK en su lugar.


1
Ah, está bien, ahora veo, estaba pensando en Users.DisplayName ha sido ordenado por la PK, lo cual no es el caso. Ahora el uso de Hash tiene mucho más sentido para mí. ¡Gracias!
Kyle Brandt

1
También puede probar la OPTION (FAST n)pista, donde n es el número aproximado de filas que espera. Lo que esto hará es sesgar el optimizador hacia bucles anidados en lugar de uniones hash cuando n es bajo. La razón es que las uniones hash son rápidas para las grandes pero tienen un alto costo de inicio. Los bucles anidados son caros por fila, pero pueden comenzar de manera muy económica. Por lo tanto, es una cuestión de ajuste en función de sus datos reales y el patrón de acceso.
Gaius

1
@Gaius: Personalmente prefiero tener índices que sugerencias. Una sugerencia solo es buena para la consulta cuando la agrega. También la pista se convierte en una responsabilidad con el tiempo. Los índices tienden a ser útiles por más tiempo.
gbn

1
no es una propuesta de uno u otro :-)
Gaius

14

De http://sqlinthewild.co.za/index.php/2007/12/30/execution-plan-operations-joins/

"La combinación hash es una de las operaciones de combinación más caras, ya que requiere la creación de una tabla hash para hacer la combinación. Dicho esto, es la combinación que es mejor para entradas grandes y sin clasificar. Es la que requiere más memoria de todas de las uniones

La combinación de hash lee primero una de las entradas y comprime la columna de combinación y coloca el hash resultante y los valores de la columna en una tabla de hash acumulada en la memoria. Luego lee todas las filas en la segunda entrada, las combina y comprueba las filas en el depósito de hash resultante para las filas de unión ".

que enlaza a esta publicación:

http://blogs.msdn.com/b/craigfr/archive/2006/08/10/687630.aspx

HTH


Entonces, si se trata solo de los campos de identificación, supongo que no entiendo la ventaja de cifrar un campo de identificación.
Kyle Brandt

+1 para el enlace al blog de Craig Freedman, hay más artículos disponibles: blogs.msdn.com/b/craigfr/archive/tags/joins
Jeff

9

La ventaja de trocear un campo numérico es que está tomando un valor mayor y dividiéndolo en partes más pequeñas para que pueda caber en una tabla hash.

Así es como lo describe Grant Fritchey:

"Una tabla hash, por otro lado, es una estructura de datos que divide todos los elementos en categorías de igual tamaño, o depósitos, para permitir un acceso rápido a los elementos. La función hash determina en qué depósito entra un elemento. Por ejemplo , puede tomar una fila de una tabla, convertirla en un valor hash y luego almacenar el valor hash en una tabla hash ".

También puede obtener una copia gratuita de su libro electrónico "Disección de planes de ejecución de SQL Server" en un enlace del siguiente artículo:

Fuente: http://www.simple-talk.com/sql/performance/graphical-execution-plans-for-simple-sql-queries/


Otra serie de artículos interesantes sobre JOINS
Jeff

Estoy trabajando a mi manera aunque Diseccionando planes de ejecución de SQL Server: ¡es genial! Pero me quedé un poco atascado en este punto :-P
Kyle Brandt

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.