Domanda

Perché qualcuno dovrebbe usare un gruppo piuttosto che distinto quando non ci sono aggregazioni fatte nella query?

Inoltre, qualcuno conosce il gruppo rispetto a distinte considerazioni sulle prestazioni in MySQL e SQL Server. Immagino che SQL Server abbia un ottimizzatore migliore e potrebbero essere vicini all'equivalente lì, ma in MySQL mi aspetto un notevole vantaggio in termini di prestazioni.

Sono interessato alle risposte dba.

EDIT:

Il post di Bill è interessante, ma non applicabile. Vorrei essere più specifico ...

select a, b, c 
from table x
group by a, b,c

vs

select distinct a,b,c
from table x
È stato utile?

Soluzione

Un po '(MOLTO) di dati empirici da MS SQL Server, su un paio di tabelle casuali dal nostro DB.

Per il modello:

SELECT col1, col2 FROM table GROUP BY col1, col2

e

SELECT DISTINCT col1, col2 FROM table 

Quando non esiste un indice di copertura per la query, entrambi i modi hanno prodotto il seguente piano di query:

|--Sort(DISTINCT ORDER BY:([table].[col1] ASC, [table].[col2] ASC))
   |--Clustered Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]))

e quando c'era un indice di copertura, entrambi prodotti:

|--Stream Aggregate(GROUP BY:([table].[col1], [table].[col2]))
   |--Index Scan(OBJECT:([db].[dbo].[table].[IX_some_index]), ORDERED FORWARD)

quindi da quel piccolissimo esempio SQL Server certamente tratta entrambi allo stesso modo.

Altri suggerimenti

GROUP BY mappa gruppi di righe su una riga, per valore distinto in specifiche colonne, che non devono nemmeno necessariamente essere nell'elenco di selezione.

SELECT b, c, d FROM table1 GROUP BY a;

Questa query è SQL legale ( correzione: solo in MySQL; in realtà non è SQL standard e non è supportato da altre marche). MySQL lo accetta e confida di sapere cosa stai facendo, selezionando b , c e d in modo inequivocabile perché essi dipendenze funzionali di a .

Tuttavia, Microsoft SQL Server e altri marchi non consentono questa query, poiché non è in grado di determinare facilmente le dipendenze funzionali. modifica: invece, l'SQL standard richiede di seguire la regola del valore singolo , vale a dire che ogni colonna nell'elenco di selezione deve essere denominata nel GROUP BY oppure essere un argomento per una funzione set.

Considerando che DISTINCT guarda sempre tutte le colonne dell'elenco di selezione e solo quelle colonne. È un'idea sbagliata comune che DISTINCT ti permetta di specificare le colonne:

SELECT DISTINCT(a), b, c FROM table1;

Nonostante le parentesi che fanno apparire DISTINCT come una chiamata di funzione, non lo è. È un'opzione di query e un valore distinto in uno dei tre campi dell'elenco di selezione porterà a una riga distinta nel risultato della query. Una delle espressioni in questo elenco di selezione contiene parentesi, ma ciò non influirà sul risultato.

In MySQL ho scoperto che l'utilizzo di GROUP BY ha spesso prestazioni migliori rispetto a DISTINCT.

Esecuzione di un " EXPLAIN SELECT DISTINCT " mostra " Usando dove; Utilizzo temporaneo di " MySQL creerà una tabella temporanea.

vs a " SELEZIONA SELEZIONA a, b, c da T1, T2 dove T2.A = T1.A GRUPPO DA a " mostra solo " Utilizzo di dove "

Entrambi genererebbero lo stesso piano di query in MS SQL Server .... Se si dispone di MS SQL Server, è possibile abilitare il piano di esecuzione effettivo per vedere quale è meglio per le proprie esigenze ...

Dai un'occhiata a questi post:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

http://www.sqlmag.com/Article/ArticleID/24282 /sql_server_24282.html

Se stai davvero cercando valori distinti, il distinto rende il codice sorgente più leggibile (come se fa parte di una procedura memorizzata) Se sto scrivendo query ad hoc di solito inizierò con il gruppo anche, anche se non ho aggregazioni perché finirò spesso per indossarle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top