Las operaciones ORDER-BY, GROUP-BY y DISTINCT son
todas tipos de ordenación. El procesador de consultas de SQL Server implementa
la ordenación de dos modos distintos. Si los registros ya están ordenados por
un índice, el procesador sólo tiene que usar el índice. De lo contrario, el
procesador debe utilizar una tabla de trabajo temporal para ordenar primero los
registros. Esta ordenación preliminar puede provocar retrasos iniciales
considerables en dispositivos con una CPU lenta y memoria limitada, y debería
evitarse si el tiempo de respuesta es importante.
En el contexto de índice con varias columnas, para que ORDER-BY o GROUP-BY
tengan en cuenta un índice concreto, las columnas ORDER-BY o GROUP-BY
deben coincidir con el conjunto de prefijos de columnas de índice en el orden
exacto. Por ejemplo, el índice CREATE INDEX Emp_Name ON Employees ("Last
Name" ASC, "First Name" ASC) puede ayudar a optimizar las
siguientes consultas:
·
... ORDER BY /
GROUP BY "Last Name" ...
·
... ORDER BY /
GROUP BY "Last Name", "First Name" ...
No ayudará a optimizar:
·
... ORDER BY /
GROUP BY "First Name" ...
·
... ORDER BY /
GROUP BY "First Name", "Last Name" ...
Para que una operación DISTINCT tenga en cuenta un índice de varias
columnas, la lista de proyección debe coincidir con todas las columnas de
índice, aunque no es necesario que estén en el orden exacto. El índice anterior
puede ayudar a optimizar las siguientes consultas:
·
... DISTINCT
"Last Name", "First Name" ...
·
... DISTINCT
"First Name", "Last Name" ...
No ayudará a optimizar:
·
... DISTINCT "First Name" ...
·
... DISTINCT "Last Name" ...
Si la consulta siempre devuelve filas únicas, no especifique la palabra
clave DISTINCT, ya que sólo aumenta la sobrecarga.
Hay que tener en cuenta que cada vez
que ponemos agrupaciones del tipo ORDER-BY, GROUP-BY
y DISTINCT, podemos
estar penalizando el rendimiento si no tenemos los índices adecuados y
muchas veces estas agrupaciones que usamos no tienen sentido ya que se pueden
hacer desde el reporte o la aplicación. En ocasiones es mejor no dar una
sobrecarga el motor, ya que he visto como quedan resuelto algunos temas de
performance en querys simplemente por eliminar estas agrupaciones, recordemos
que las agrupaciones las podemos hacer muchas veces en la grilla de nuestra
aplicación sin castigar al motor de base.
Se recomienda la lectura:
En definitiva, puede mejorar el rendimiento de la aplicación SQL Server,
optimizando las consultas que utiliza. En los próximos días publicaré en mi
blog (este mismo) otras técnicas fáciles que pueden aplicarse para optimizar el
rendimiento de las consultas.
A puntes y recopilaciones de Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.