jueves, 10 de abril de 2014

Sort Warning - qué es y cómo evitarlo -

Amigos,

     Probablemente hayan dado con este mensaje estudiando un plan de ejecución, o auditando el sql server a traves de la consulta del trace file ( http://gherrerasqlserver.blogspot.com.ar/2011/09/auditando-sql-server-consultando-el.html)


          Ante todo digamos que la detección de un Sort Warning, no es un hecho que debamos dejarlo pasar, ya que puede implicar una importante merma en la performance de las queries afectadas.

      Qué indica un "Sort Warning" ?

      Puntualmente indica que el motor de nuestro SQL Server está resolviendo en el disco un ordenamiento  indicado en una query (ORDER BY), escribiendo y leyendo datos desde la TempDB, en lugar de resolverlo en la memoria RAM.
  
      No hace falta decir pues, que cualquier lectura o escritura hecha desde el disco es mucho más lenta y nociva que otra hecha en memoria.

          
    Pero es que estamos mal de memora RAM ?  No necesariamente..

    Entonces qué pasa?

    Veamos …

     ORIGEN DEL PROBLEMA

      El Sql Server genera un plan de ejecución y lo cachea para cada query y para cada sp. Cuando esa query  o sp incluye “order by” lo que hace es determinar la cantidad de memoria que ese order by  va a precisar y ya lo guarda como parte del plan de ejecución. 

      Ocurre que , el SQL,  "se queda corto" en esa cálculo,  porque de pronto se puede encontrar con que las columnas a ordenar terminan siendo muchas más que las que tomó como ejemplo cuando hizo ese plan de ejecución que ahí quedó, clavado en memoria:

       Hay 3 motivos por los cuales los ORDER BY pueden tener dimensiones mayores a las normales y llevar al sql server a leer de disco:

1)      La query en el Where compara un campo de la tabla contra otro campo de la misma tabla dando un valor muy grande.

Select   ani
from
Smsmessages
Where date_begin = date_end
ORDER BY  ANI

2)       La query en el Where compara un campo de la tabla contra una variable externa

Select   ani
from
Smsmessages
Where  Id > @variable
ORDER BY  ANI

3)       Una query con order by dentro de un sp recibe un parámetro a través del mismo que hace que tenga que ordenar muchos más datos que los que el plan del sp tenía pensado.

  
     Les aseguro que los problemas de performance que se producen a instancias de los sort-warnings son bastante considerables, críticos.

    SOLUCION

     Cuál es la solución siendo que no se puede evitar los 3 motivos de arriba?

      Simplemente evitar los ORDER BY cuando no son estrictamente necesarios. (no se rian por favor) .   En verdad si un order by no va acompañado de un top, hablamos de un order by que apunta a entregar data presentada de tal o cual forma, pues bien, CAMBIEMOS EL CAMPO DEL ORDER BY (busquemos uno que no sea influenciado por los 3 motivos de arriba) o bien ELIMINEMOSLO.

     Consejo:   no dejen pasar de largo nunca un "Sort Warning". Ataquen sus orígenes y aleccionen a los desarrolladores para que dejen de lado los ORDER BY cuando no son estrictamente necesarios. Por último, revean los order by de las queries o sp si es que están padeciendo el problema.

Les saluda desde Argentina, Gustavo Herrera
      

No hay comentarios:

Publicar un comentario