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