consulta las ganancias de rendimiento al eliminar la coincidencia interna del operador

9

Al intentar aplicar el contenido de esta pregunta a mi propia situación, estoy un poco confundido acerca de cómo podría deshacerme del operador Hash Match (Inner Join) si es posible.

Rendimiento de consultas de SQL Server: eliminación de la necesidad de Hash Match (Inner Join)

Noté el costo del 10% y me preguntaba si podría reducirlo. Vea el plan de consulta a continuación.

ingrese la descripción de la imagen aquí

Este trabajo proviene de una consulta que tuve que ajustar hoy:

SELECT c.AccountCode, MIN(d.CustomerSID) 
FROM   Stage.Customer c 
INNER JOIN Dimensions.Customer d  ON c.Email = d.Email
                                  OR (
                                          c.HomePostCode = d.HomePostCode
                                       AND c.StrSurname = d.strSurname
                                                                    )
GROUP BY c.AccountCode

y después de agregar estos índices:

---------------------------------------------------------------------
-- Create the indexes
---------------------------------------------------------------------

CREATE NONCLUSTERED INDEX IDX_Stage_Customer_HOME_SURNAME_INCL
ON Stage.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go


CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_HOME_SURNAME_INCL
ON Dimensions.Customer(HomePostCode ,strSurname)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 0
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go



CREATE NONCLUSTERED INDEX IDX_Stage_Customer_EMAIL_INCL
ON Stage.Customer(EMAIL)
INCLUDE (AccountCode)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go


CREATE NONCLUSTERED INDEX IDX_Dimensions_Customer_EMAIL_INCL
ON Dimensions.Customer(EMAIL)
INCLUDE (AccountCode,CustomerSID)
--WHERE HASEMAIL = 1
--WITH (ONLINE=ON, DROP_EXISTING = ON)
go

Esta es la nueva consulta:

----------------------------------------------------------------------------
-- new query 
----------------------------------------------------------------------------

SELECT * 
FROM (    
SELECT AccountCode
     ,RO=ROW_NUMBER () OVER (PARTITION BY AccountCode ORDER BY CustomerSID)
     --,CustomerSID=MIN(CustomerSID) OVER (PARTITION BY AccountCode ORDER BY AccountCode)
       ,CustomerSID
FROM (    
          SELECT c.AccountCode, D.CustomerSID
       FROM   Stage.Customer c 
       INNER JOIN Dimensions.Customer d  ON c.Email = d.Email

          UNION ALL

          SELECT c.AccountCode, D.CustomerSID
       FROM   Stage.Customer c 
       INNER JOIN Dimensions.Customer d  ON c.HomePostCode = d.HomePostCode
                                        AND c.StrSurname = d.strSurname
) RADHE
) R1
WHERE RO = 1

Esto ha reducido el tiempo de ejecución de la consulta de 8 minutos a 1 segundo.

Todos están contentos, pero aun así me gustaría saber si podría hacer más cosas, es decir, eliminando de alguna manera el operador de coincidencia hash.

¿Por qué está allí en primer lugar? Estoy haciendo coincidir todos los campos, ¿por qué hash?

Marcello Miorelli
fuente

Respuestas:

14

Los siguientes enlaces proporcionarán una buena fuente de conocimiento sobre los planes de ejecución.

De los conceptos básicos del plan de ejecución: Hash Match Confusion encontré:

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

¿Puedes explicar este plan de ejecución? proporciona buenas ideas sobre el plan de ejecución con, no específico para la coincidencia hash pero relevante.

Los escaneos constantes son una forma para que SQL Server cree un depósito en el que colocará algo más adelante en el plan de ejecución. He publicado una explicación más completa de esto aquí . Para comprender para qué sirve la exploración constante, debe profundizar en el plan. En este caso, son los operadores Compute Scalar los que se utilizan para completar el espacio creado por el escaneo constante.

Los operadores de Compute Scalar se están cargando con NULL y el valor 1045876, por lo que claramente se usarán con Loop Join en un esfuerzo por filtrar los datos.

La parte realmente genial es que este plan es trivial. Significa que pasó por un proceso de optimización mínimo. Todas las operaciones conducen al intervalo de fusión. Esto se utiliza para crear un conjunto mínimo de operadores de comparación para una búsqueda de índice ( detalles sobre eso aquí ).

En esta pregunta: ¿Puedo hacer que SSMS me muestre los costos de la consulta real en el panel del plan de ejecución? Estoy solucionando problemas de rendimiento en un procedimiento almacenado de varias declaraciones en SQL Server. Quiero saber en qué parte (s) debo pasar el tiempo.

Comprendo ¿Cómo leo el costo de la consulta? ¿Es siempre un porcentaje? que incluso cuando se le dice al SSMS que incluya un plan de ejecución real, las cifras del "costo de la consulta (en relación con el lote)" todavía se basan en estimaciones de costos, que pueden estar muy lejos de los reales

Medición del rendimiento de la consulta: "Costo de la consulta del plan de ejecución" frente a "Tiempo de espera" proporciona una buena información para cuando necesite comparar el rendimiento de 2 consultas diferentes.

En Leer un plan de ejecución de SQL Server puede encontrar excelentes consejos para leer el plan de ejecución.

Otras preguntas / respuestas que realmente me gustaron porque son relevantes para este tema, y ​​para mi referencia personal que me gustaría citar son:

Cómo optimizar la consulta T-SQL usando el Plan de ejecución

¿SQL puede generar un buen plan para este procedimiento?

Los planes de ejecución difieren para la misma instrucción SQL

Marcello Miorelli
fuente