Buscar este blog

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
      

UPGRADE SQL SERVER VERSION - 5 PASOS PREVIOS INDISPENSABLES -

Amigos,

   Ha llegado el momento de pasar de una versión de SQL SERVER hacia otra. Ya tienen la decisión tomada, han estudiado los features y las ventajas que les proporciona la nueva versión y cuentaN con el prespuesto para adquirir el software...

   En primer lugar deben elegir entre hacer una instalación "limpia", desde cero. O escoger la segunda opción, la de hacer un "upgrade" de la versión de sql server que hoy tienen hacia la versión hacia la cual desean migrar.

  Basándome en un típico upgrade, en este caso de SqlServer 2005 a SqlServer2008 R2, quiero recomendarles que sigan los 5 pasos que a continuación les dejo y eviten la tentadora y peligrosa opción de "dejarse llevar" por el Wizzard y dejar librada vuestra suerte "a las buenas de Dios".

  La forma profesional de encarar esta tarea es la siguiente: 


1)      VERIFICAR QUE NUESTRO UPGRADE SEA SOPORTADO

 

http://msdn.microsoft.com/en-us/library/ms143393(v=sql.105).aspx

 

 

2)      CORRER EL SQL SERVER UPGRADE ADVISOR

 

        Se debe utilizar el Microsoft SQL Server 2008 Upgrade Advisor

 

       2.1)  Detalle

 

-          Analiza instancias de Sql Server 2000 y Sql Server 2005 en preparación para el upgrade
-          Identifica cambios de recursos y configuración que pueden afectar el funcionamiento del sistema cuando se lleva a cabo el upgrade.
-          Provee links con documentación que describen e identifican cada problema encontrado y dice como resolverlo

         2.2)  Download

             -     El link es http://www.microsoft.com/en-us/download/details.aspx?id=11455
-          Hay 3 tipos de archivos disponibles
File name: 

SqlUA.msi                 (para 32 bits)

SqlUA_ia64.msi         (para 64 bits con procesador con arquitectura Itanium) 

SqlUA_x64.msi          (para 64 bits con arquitectura standard)


          2.3)  Requerimientos del Sistema

-          The Microsoft .NET Framework 2.0
-          Windows Installer 4.5 (para saber que versión de Windows installer tiene ingrese a run y escriba y ejecute este comando “msiexec.exe /?.”)


2.4)  Información Adicional

-          Upgrade Advisor puede analizar instancias remotas, excepto para Report.Services
-          No cambia ninguna configuración, settings o data.
-          Provee el UpgradeAvisorWizardCmd commad-prompt para ayudar a escanear múltiples instancias de Sql Server
-          No considerar “Other Issues” en el reporte generado


3)      VERIFICAR LOS REQUERIMIENTOS DE HARDWARE

 

 

-          Si vamos a encarar un upgarade “in situ” en lugar de una migración es sumamente importante verificar los requerimientos de hardware previamente para ello Microsoft nos provee de la siguiente página: http://msdn.microsoft.com/en-us/library/ms143506(v=sql.105).aspx


4)       REALIZAR UN BACKUP FULL PREVIO AL UPGRADE

 

-           Generalmente no debiesen existir mayores problemas en un proceso de upgrade mas es imperioso tomar la precaución de hacer un Backup Full que nos permita revertir el Sql Server al estado previo al Upgrade.
-          

5)       TOMAR  ALGUNOS RECAUDOS ADICIONALES

 

-           Desactivar aquellos store procedures que vayan a correr por Schedule en el proceso de upgrade
-          Hacer un check de la Master – Model – MSDB y TEMPD y verificar que tengan habilitado el autogrow y espacio en disco para hacerlo.
-          Setear el “Max Worker Threads” value to 0 para que el Sql Server ya upgredeado calcule automáticamente el valor óptimo para esa variable.
-          Estemos atentos de features que son discontinuados de una versión a otra.



   Estoy a disposición de uds como siempre.

   Les saluda Gustavo Herrera desde Argentina.