Buscar este blog

viernes, 11 de abril de 2014

HASH WARNING - qué es y cómo evitarlo -

   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.