
Para los que trabajamos construyendo soluciones de IT el rendimiento de nuestros proyectos es muy importante por eso siempre tenemos que tener en cuenta cuales son las mejores prácticas para construir ciertas funcionalidades. En esta entra mi compañero en armas José Rivera nos escribe sobre cómo obtener el mejor rendimiento cuando construimos un query que utiliza agrupaciones en la base de datos Microsoft SQL 2005.
¡Buenas tardes compañeros!
Estuve leyendo un articulo interesante donde demuestran que el usar “distinct” dentro de un “query” que esté usando agregaciones, puede ser ineficiente (incluyendo SQL 2008)
Esto es porque SQL no crea los distintos (distinct) de camino a las agregaciones. Ejemplo:
select
sum(salary),
max(salary),
count(employeeid)
Este “query” contiene tres agregaciones las cuales según las tablas estén creadas, pueden trabajar rápidamente. Pero si añadimos:
select
sum(salary),
max(salary),
count(distinct employeeid),
Esto hace que el distinto se analice dentro de los resultados; dentro de CADA resultado de las agregaciones, consumiendo más recursos que si hubieran hecho el distinto por agregación en un “query” aparte (Me refiero, hacer cada agregación aparte y usar el distinto en cada “query”), y ni siquiera el Optimizer lo rescribiría eficiente!
Aquíles envio un ejemplo de cómo seria una agregación de distinto y luego un ejemplo de cómo usar las mismas agregaciones para crear un “distinto” que calcula mas rápido que usando el distinto (medio confuso, no?)
select
count(*) as CountStar,
count(distinct ProductKey) as CountProductKeys
from FISinFRS
Y ahora , la “solución”
PartialSums as (
select
count(*) as CountStarPartialCount
from FISinFRS
group by ProductKey
)
select
sum(CountStarPartialCount) as CountStar,
sum(1) as CountProductKeys
from PartialSums
Les escribo esto solo para su conocimiento. ¡Si van a hacer distintos, tengan cuidado con el performance!
¿Comentarios?
Se utilizó como referencia este artículo del blog de MSDN http://blogs.msdn.com/sqlqueryprocessing/

