2009-04-28 31 views
11

¿Cuáles son las ventajas, si las hubiera, de realizar explícitamente un HASH JOIN sobre un JOIN regular (en el que SQL Server decidirá la mejor estrategia de JOIN)? Por ejemplo:ventajas al especificar HASH JOIN sobre simplemente hacer una JOIN?

select pd.* 
from profiledata pd 
inner hash join profiledatavalue val on val.profiledataid=pd.id 

En el código de ejemplo simplista anterior, estoy especificando la estrategia de combinación, mientras que si lo dejo fuera de la "almohadilla" palabra clave de SQL Server va a hacer una combinación de mezcla detrás de las escenas (por el "real plan de ejecución").

Respuesta

12

El optmiser hace un buen trabajo para el uso diario. Sin embargo, en teoría podría ser necesario 3 semanas para encontrar el plan perfecto en el extremo, por lo que existe la posibilidad de que el plan generado no sea ideal.

Lo dejo en paz a menos que tenga una consulta muy compleja o grandes cantidades de datos donde simplemente no puede producir un buen plan. Entonces lo consideraría.

Pero con el tiempo, a medida que los datos cambian/crecen o los índices cambian, etc., su sugerencia de JOIN se volverá obsoleta e impedirá un plan óptimo. Una sugerencia de JOIN solo puede optimizar esa única consulta en el momento del desarrollo con ese conjunto de datos que tiene.

Personalmente, nunca he especificado una sugerencia de JOIN en ningún código de producción.

Normalmente he resuelto una mala unión al cambiar mi consulta, agregar/cambiar un índice o descomponerlo (por ejemplo, cargar una tabla temporal primero). O mi consulta fue incorrecta, o tuve una conversión de tipo de datos implícita, o resaltó un error en mi esquema, etc.

He visto a otros desarrolladores usarlos, pero solo cuando tenían vistas complejas anidadas en vistas complejas y causaron problemas posteriores cuando refactorizaron.

Editar:

tuve una conversión actual, donde algunos colegas se van a utilizar para forzar un plan de consulta mala (con NOLOCK y MAXDOP 1) a "alentar" la migración lejos del complejo legado vistas anidadas que uno de su sistema descendente llama directamente.

0

El optimizador de planes lógicos no le asegura que encuentre la solución óptima: un algoritmo exacto es demasiado lento para ser utilizado en un servidor de producción; en su lugar, se utilizan algunos algoritmos codiciosos.

Por lo tanto, la razón detrás de esos comandos es permitir que el usuario especifique la estrategia de combinación óptima, en el caso de que el optimizador no pueda determinar qué es lo mejor para adoptar.

2

Hash se une a la paralelización y escala mejor que cualquier otra combinación y son excelentes para maximizar el rendimiento en los almacenes de datos.

1

La única pista que he visto en el código de envío fue OPCIÓN (PEDIDO DE FUERZA). La estúpida falla en el optimizador de consultas SQL generaría un plan que intentó unir un varchar no filtrado y un identificador único. Agregar FORDER ORDER hizo que ejecutara primero el filtro.

Lo sé, la sobrecarga de columnas es mala. A veces, tienes que vivir con eso.

+0

Editar Estoy a punto de agregar una OPCIÓN (MAXDOP 1) para evitar que un trabajador de fondo mastique toda la potencia del procesador. – Joshua

3

Al probar una pizca de hash, ¿qué tal:

  • Después de comprobar que existen los índices adecuados en al menos una de las mesas .
  • Después de haber intentado volver a organizar la consulta.Cosas como la conversión de se une a "en" o "existe", el cambio de orden de combinación (que es en realidad sólo una pista de todos modos), moviendo la lógica de la cláusula where a condición de unión, etc.

Algunas reglas básicas acerca de cuándo una combinación hash es efectiva cuando una condición de unión no existe como un índice de tabla y cuando los tamaños de las tablas son diferentes. Si busca una descripción técnica, hay algunas buenas descripciones sobre cómo funciona una combinación de hash.

¿Por qué utilizar alguna sugerencia de combinación (hash/merge/loop con efecto secundario de orden de fuerza)?

  • Para evitar la ejecución extremadamente lenta (.5 -> 10.0s) de las cajas de esquina.
  • Cuando el optimizador elige sistemáticamente un plan mediocre.

Es probable que una sugerencia suministrada no sea ideal para algunas circunstancias, pero proporciona tiempos de ejecución más consistentemente predecibles. El peor caso esperado y los mejores escenarios deberían ser probados previamente al usar una pista. Los tiempos de ejecución predecibles son críticos para los servicios web donde se prefiere una consulta nominal [.3s, .6s] rígidamente optimizada sobre una que pueda tener un rango de [.25, 10.0s] por ejemplo. Las grandes variaciones en el tiempo de ejecución pueden ocurrir con las estadísticas actualizadas y las mejores prácticas seguidas.

Al realizar pruebas en un entorno de desarrollo, también se deben desactivar las "trampas" para evitar variaciones de tiempo de ejecución frío/calor. De otra post ...

CHECKPOINT -- flushes dirty pages to disk 
DBCC DROPCLEANBUFFERS -- clears data cache 
DBCC FREEPROCCACHE -- clears execution plan cache 

La última opción puede ser la misma que la opción de sugerencia (recompilación).

El MAXDOP y la carga de la máquina también pueden marcar una gran diferencia en el tiempo de ejecución. La materialización de CTE en tablas temporales también es un buen mecanismo de bloqueo y algo a considerar.