Para tener un buen performance en stored procedures o sentencias sql hay que tener en cuenta entre otras cosas , los puntos enumerados a continuación:
1.- Tratar de evitar en lo posible el uso de sentencias llamadas non-sargable en los argumentos de 'where'. Por ejemplo "is nul", "or" , "<>" , "!=", "!>" , "NOT EXIST", "NOT IN", " NOT LIKE" y "LIKE %500" que aunque no siempre, a menudo impiden que el optimizador use un indice para ejecutar la búsqueda. En adición, las expresiones que incluyen funciones sobre una columna ó expresiones que tienen la misma columna en ambos lados del operador, son non-sargable.
2.- Si tienes un query que usa la sentencia 'NOT IN' , que ofrece un bajo desempeño debido ya que el optimizador tiene que realizar un nested table scan, es mejor utilizar alguna de las siguientes alternativas:
- EXISTS ó NOT EXISTS
- IN
- Realizar un LEFT OUTER JOIN y checar con una condición nula.
3.- Cuando hay opción de escoger entre la sentencia IN ó EXISTS, generalmente la segunda se ejecuta con mayor velocidad.
4.- Cuando uses LIKE en la sentencia where , trata de usar uno o más caracteres que antecedan el wildcard, por ejemplo LIKE 'ma%' , asi el optimizador tendra la habilidad de usar un índice para ejecutar el query, en cambio si el primer caracter es % el optimizador no podra tomar el indice y un table scan será ejecutado.
5.- Funciones y columnas separadas en la sentencia where, por ejemplo:
- Esta sentencia no tomará el indice:
select member_number, first_name, last_name
from members
where datediff(yy,dateofbirth,GETDATE()) >21
- Aqui aplicamos la recomendación y el índice será utilizado:
select member_number,first_name,last_name
from members
where dateofbirth < DATEADD(vv,-21,GETDATE())