2015-08-07 5 views
12

für den einfachsten Fall, dass wir alle zu verweisen:verschiedene vs Gruppe, durch die besser

select id from mytbl 
group by id 

und

select distinct id from mytbl 

wie wir wissen, sie erzeugen gleiche Abfrage-Plan, die in einigen wiederholt erwähnt worden Artikel wie Which is better: Distinct or Group By

In Bienenstock hat jedoch erstere nur eine Aufgabe zu reduzieren, während letztere viele hat.

Aus Experimenten habe ich festgestellt, dass die GROUP BY 10 + mal schneller als DISTINCT ist.

Sie sind anders.

Also, was ich gelernt habe, ist:

GROUP-BY ohnehin nicht schlechter als DISTINCT ist, und es ist manchmal besser.

Ich möchte wissen:

. Wenn diese Schlussfolgerung zutrifft.

. Wenn das stimmt, werde ich DISTINCT als einen Ansatz für logische Bequemlichkeit betrachten, aber warum nimmt DISTINCT nicht die bessere Implementierung von GROUP-BY?

. Wenn es falsch ist, wäre ich sehr gespannt auf seine anständige Verwendung unter Big-Data-Situation.

Vielen Dank !! :)

+0

Die von Ihnen verknüpfte Frage bezieht sich speziell auf das Verhalten von MS SQL Server. Verschiedene Engines haben unterschiedliche Ansätze, verschiedene Optimierungen etc. Es gibt keinen Grund zu der Annahme, dass, nur weil "group by" und "distinct" in MS SQL (einer bestimmten Version) gleichwertig sind, dies auch für Hive gilt. Haben Sie EXPLAIN verwendet, um sich die tatsächlichen Ausführungspläne anzusehen? – Luaan

+0

Danke. Ich nahm Ihren Ansatz und nutzte die vergangenen zwei Tage in die Abfragepläne meines SQL. Die interessante Sache ist, für den einfachen Fall wie oben, sind die Abfragepläne die gleichen (alle unter Verwendung von Gruppierung), aber unterschiedlich, wenn ich viele DISTINCT + UNION gegen GROUPBY + UNION setzen. – Chiron

+0

Vielleicht hat das einen guten Grund, oder vielleicht ist es nur ein Versehen (anders ist es nicht mehr so ​​weit verbreitet wie früher - es war früher der Go-to-Hack für schlecht designte DBs). Du könntest dies auf Hadoop/Hive's issue tracker posten oder so, aber du wirst wahrscheinlich immer noch damit rollen müssen. Es ist nicht immer offensichtlich, warum zwei ähnliche Anfragen unterschiedlich ausgeführt werden. – Luaan

Antwort

11

Ihre Erfahrung ist interessant. Ich habe den einzigen Reduktionseffekt für distinct gegenüber group by nicht gesehen. Vielleicht gibt es einen kleinen Unterschied im Optimierer zwischen den beiden Konstrukten.

A "Hervorragend" in Beispiel Bienenstock ist:

select count(distinct id) 
from mytbl; 

Vergleich

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

Erstere verwendet nur ein Reduzierstück und das letztere arbeitet parallel. Ich habe dies sowohl in meiner Erfahrung gesehen, als auch dokumentiert und diskutiert (zum Beispiel auf den Folien 26 und 27 in dieser). So kann distinct definitiv die Parallelität ausnutzen.

Ich stelle mir vor, dass wenn Hive reift, solche Probleme behoben werden. Es ist jedoch ironisch, dass Postgres ein ähnliches Performance-Problem mit COUNT(DISTINCT) hat, obwohl ich denke, dass der zugrunde liegende Grund ein bisschen anders ist.

+0

Vielen Dank! Ich habe die vergangenen zwei Tage in die Abfragepläne meines SQL untersucht. Die interessante Sache ist, für den einfachen Fall wie oben, sind die Abfragepläne die gleichen (alle unter Verwendung von Gruppierung), aber unterschiedlich, wenn ich viele DISTINCT + UNION gegen GROUPBY + UNION setzen. Was ich getan habe, ist einfach jede "DISTINCT key" -Klausel in "GROUP BY key" -Klausel ohne irgendeine andere strukturelle Änderung zu ändern. Die Abfragepläne zeigten, dass: in DISTINCT meine statische Spalte wie: <"TagString" als Tag> in Gruppenschlüssel eingefügt wird, aber nicht, wenn 'Gruppe für Schlüssel' verwendet wird. – Chiron

+0

Ich verstehe nicht, warum ein einzelner statischer Wert die Geschwindigkeit von GROUP-BY beeinflussen würde. – Chiron

+0

Vielen Dank nochmal! Aber ich fühle mich immer noch schwer die Antworten auf meine 3 Verwirrungen klar aus Ihrer Antwort zu sehen. Wenn Sie ein wenig mehr Licht in meinen Kopf werfen möchten, wäre ich sehr froh, dieses Problem mit Ihrer Antwort zu lösen. – Chiron