2012-05-18 11 views
21

So che in semplici query le prestazioni e i piani di esecuzione di Distinct e Group By sono quasi gli stessi.Quando le prestazioni di Distinct e Group By sono diverse?

ad es.

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

Ma ho letto in alcuni scenari la loro prestazione sarebbe diversa per es. nelle sottoquery, ecc?

Quindi, potresti fare qualche esempio o spiegare alcuni scenari in cui le loro prestazioni sono diverse?

Molte grazie

+1

Quando lo fanno lo stesso cosa, la loro performance è la stessa. Quando fanno cose diverse, le loro prestazioni possono essere diverse. Se ci sono esempi specifici a cui sei interessato, dovresti includerli nella tua domanda. – AakashM

+0

potresti fare un esempio? –

+2

Perché i downvotes? È una domanda correlata alla programmazione (anche se la risposta è "no, non possiamo"). – Quassnoi

risposta

16

Se si include un valore calcolato nell'elenco dei campi si vedrà una differenza nel piano di esecuzione.

select Value, 
     getdate() 
from YourTable 
group by UnitID 

select distinct 
     Value, 
     getdate() 
from YourTable 

Il group by interrogazione aggregati prima che calcola il valore scalare. La query distinct calcola il valore scalare prima dell'aggregazione.

+0

Quindi, questo potrebbe potenzialmente produrre un risultato e/o una prestazione diversa. –

+2

@William - Risultato diverso. Il problema di prestazioni più ovvio che ho visto è quando si fa una concatenazione di stringhe usando il trucco 'for xml'. Ho visto sia una versione che usa 'distinct' che una versione che usa' group by' e la versione 'group by' è molto più veloce. Ma anche questa semplice query eseguita oltre 500000 righe che generano 40 gruppi mostra una differenza di prestazioni. Per me, 'group by' richiede 80 ms e' distinct' richiede 105 ms. –

+0

no, può certamente produrre un risultato diverso. Ad esempio, immagina di avere una colonna calcolata come ROW_NUMBER() o una funzione definita dall'utente che restituisce un valore. In tali scenari, per Distinct prima viene eseguita la colonna calcolata per ogni riga nella tabella, quindi vengono aggiunte le colonne scalari mentre quando si utilizza Raggruppa per, prima vengono raggruppate le colonne scalari per ciascun gruppo viene calcolata la colonna calcolata. In questo modo possono produrre risultati diversi perché Distinti e Raggruppa eseguendo le colonne calcolate in un ordine diverso. –

7

Ecco 2 esempi, uno per produrre un risultato diverso e l'altro per un diverso andamento:

Example for producing different performance

E il secondo esempio:

Example for producing different result