2012-05-18 14 views
21

Sé por consultas simples que el rendimiento y los planes de ejecución de Distinct y Group By son casi los mismos.¿Cuándo el rendimiento de Distinct y Group By es diferente?

p. Ej.

SELECT Name FROM NamesTable GROUP BY Name 
SELECT DISTINCT Name FROM NamesTable 

Pero he leído en algunos escenarios que su rendimiento sería diferente, p. en subconsultas, etc.

Entonces, ¿podría hacer algunos ejemplos o explicar algunos escenarios donde su rendimiento es diferente?

Muchas gracias

+1

Cuando ellos hacen lo mismo cosa, su rendimiento es el mismo. Cuando hacen cosas diferentes, su rendimiento puede ser diferente. Si hay ejemplos específicos que le interesen, debe incluirlos en su pregunta. – AakashM

+0

podría hacer un ejemplo? –

+2

¿Por qué los votos a favor? Es una pregunta respondible relacionada con la programación (aunque la respuesta es "no, no podemos"). – Quassnoi

Respuesta

16

Si incluye un valor calculado en la lista de campos, verá una diferencia en el plan de ejecución.

select Value, 
     getdate() 
from YourTable 
group by UnitID 

select distinct 
     Value, 
     getdate() 
from YourTable 

La consulta group by agregados antes de que se calcula el valor escalar. La consulta distinct calcula el valor escalar antes del agregado.

+0

Por lo tanto, esto podría producir un resultado y/o rendimiento diferente. –

+2

@William - No es un resultado diferente. El problema de rendimiento más obvio que he visto es cuando estás haciendo una concatenación de cadenas usando el truco 'for xml'. He visto una versión que usa 'distinct' y una versión que usa' group by' y la versión 'group by' es mucho más rápida. Pero incluso esta simple consulta cuando se ejecuta sobre 500000 filas que generan 40 grupos muestra una diferencia de rendimiento. Para mí, 'group by' toma 80 ms y' distinct' toma 105 ms. –

+0

no, ciertamente puede producir un resultado diferente. Por ejemplo, imagine que tiene una columna calculada como ROW_NUMBER() o una función definida por el usuario que devuelve un valor. En tales escenarios, para Distinct primero se ejecuta la columna calculada para cada fila en la tabla, luego se agregan las columnas escalares, mientras que cuando se usa Group By, primero las columnas escalares se agrupan para entonces para cada grupo se calcula la columna calculada. Por lo tanto, pueden producir resultados diferentes porque Distinct y Group By ejecutan Columnas calculadas en un orden diferente. –

7

Éstos son 2 ejemplos, uno para producir un resultado diferente y el otro para una actuación diferente:

Example for producing different performance

Y el segundo ejemplo:

Example for producing different result