Categorized | Tecnología

Mejorar el rendimiento cuando se usan agrupaciones en MS SQL

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/

Leave a Reply