2015-08-07 11 views
12

per il caso più semplice che tutti noi riferiamo a:distinta vs gruppo con cui è meglio

select id from mytbl 
group by id 

e

select distinct id from mytbl 

come sappiamo, che generano lo stesso piano di query che era stato più volte citato in qualche articoli come Which is better: Distinct or Group By

Nell'alveare, tuttavia, il primo ha solo un compito di riduzione mentre il secondo ne ha molti.

Da esperimenti, ho fondato che GROUP BY è 10+ volte più veloce di DISTINCT.

Sono diversi.

Quindi quello che ho imparato è:

GROUP BY-è in ogni caso non è peggio di DISTINCT, ed è meglio a volte.

Vorrei sapere:

. Se questa conclusione è vera.

. Se vero, considererò DISTINCT come un approccio per la convenienza logica, ma perché DISTINCT non prende l'implementazione migliore di GROUP-BY?

. Se falso, sarei molto desideroso di conoscere il suo uso decente in situazioni di big-data.

Grazie mille !! :)

+0

La domanda che hai collegato riguarda specificamente il comportamento di MS SQL Server. Motori diversi hanno approcci diversi, diverse ottimizzazioni, ecc. Non c'è motivo di credere che solo perché 'group by' e' distinct' sono equivalenti su MS SQL (di alcune versioni specifiche) questo vale anche per Hive. Hai usato EXPLAIN per esaminare i piani di esecuzione effettivi? – Luaan

+0

Grazie. Ho seguito il tuo approccio e ho utilizzato i due giorni trascorsi esaminando i piani di query del mio SQL. La cosa interessante è che, per un caso semplice come sopra, i piani di query sono gli stessi (tutti utilizzano group-by) ma diversi quando inserisco molti DISTINCT + UNION rispetto a GROUPBY + UNION. – Chiron

+0

Forse questo ha una buona ragione, o forse è solo una svista (distinto non è abbastanza diffuso come un tempo - era usato per hackerare i DB mal progettati). Potresti postarlo su Hadoop/Hive's issue tracker o qualcosa del genere, ma probabilmente continuerai a rotolarlo. Non è sempre ovvio perché due query simili finiscono per essere eseguite in modo completamente diverso. – Luaan

risposta

11

La vostra esperienza è interessante. Non ho visto l'effetto del singolo riduttore per distinct rispetto a group by. Forse c'è una sottile differenza nell'ottimizzatore tra i due costrutti.

Un esempio "brillante" in Hive è:

select count(distinct id) 
from mytbl; 

contro

select count(*) 
from (select distinct id 
     from mytbl 
    ) t; 

Il primo usa solo un riduttore e quest'ultimo opera in parallelo. Ho visto questo sia nella mia esperienza, che è documentato e discusso (per esempio, sulle diapositive 26 e 27 in questo presentation). Quindi, distinct può sicuramente sfruttare il parallelismo.

Immagino che con l'invecchiamento di Hive, tali problemi verranno risolti. Tuttavia, è ironico che Postgres abbia un problema di prestazioni simile con COUNT(DISTINCT), anche se penso che la ragione sottostante sia leggermente diversa.

+0

Grazie mille! Ho usato i due giorni passati esaminando i piani di query del mio SQL. La cosa interessante è che, per un caso semplice come sopra, i piani di query sono gli stessi (tutti utilizzano group-by) ma diversi quando inserisco molti DISTINCT + UNION rispetto a GROUPBY + UNION. Quello che ho fatto è semplicemente cambiare ogni clausola 'DISTINCT key' nella clausola 'GROUP BY key' senza altre modifiche strutturali. I piani di query hanno mostrato che: in DISTINCT, la mia colonna statica come: <"TagString" come tag> sarà inclusa nelle chiavi di gruppo, ma non quando si utilizza 'group by key'. – Chiron

+0

Non capisco perché un singolo valore statico in più influenzi la velocità di GROUP-BY. – Chiron

+0

Grazie mille ancora! Ma mi sento ancora difficile vedere chiaramente le risposte alle mie 3 confusioni dalla tua risposta. Se ti piacerebbe gettare un po 'più di luce nella mia mente, sarei molto felice di risolvere questo problema usando la tua risposta. – Chiron