Amigos,
Que tal... Hoy quiero contarles acerca de los "HASH WARNINGS" que uds. muy probablemente hayan encontrado estudiando sus planes de ejecución o bien auditando el SqlSrv a través de la consulta del trace file (ver http://gherrerasqlserver.blogspot.com.ar/2011/09/auditando-sql-server-consultando-el.html) etc
Qué indica un "Hash Warning"?
Indica que nuestro motor de base de datos está leyendo o escribiendo datos desde el disco (TempDb), algo muy malo para nuestra performance.
ORIGEN DEL PROBLEMA
El Sql Server hace un Hash cuando tiene que joinear dos tablas y se encuentra
con que los campos correspondientes al Join no están ordenados por la falta de
idx o bien, están indexados pero las estadísticas que subyacen de esos idx están desactualizadas
El Hash es un algoritmo que utiliza el motor de nuestra base de datos para resolver los joins cuando no encuentra los campos ordenados (indexados). Concretamente separa en pequeños grupos los registros correspondientes a esos campos para poder matchearlos con mayor facilidad. Cuando esos grupos exceden la capacidad de almancenamiento en memoria, el sql los vuelca a la TemDb qenerando el no deseado HASH WARNING.
SOLUCION DEL PROBLEMA
-
Revisar que siempre
las columnas de un join tengan su correspondiente idx
-
Tener actualizadas
las estadísticas de esos idx (nosotros tenemos un sp que una vez por semana se
encarga de eso)
-
Si el problema
persiste ir hacia otro tipo de join, por ejemplo el merge join.
A tenerlo en cuenta y a poner en sintonía a los desarrolladores que poco saben de los problemas que pueden acarrear sus códigos pocos cuidadosos.
Les saluda Gustavo Herrera desde Argentina.
Mi nombre es Gustavo Herrera. Me desempeño profesionalmente como DBA especializado en Microsoft Sql Server, formo parte activamente de la Comunidad Sql Server de Argentina (comunidad oficial de Microsoft). La idea de este blog es generar un vínculo más de intercambio con uds., mis queridos colegas. Espero que se sientan a gusto, pasen, vean, opinen, comenten, critiquen, aporten.. este blog lo hacemos entre todos.