select count(distinct user)
from some_table;
Diese Abfrage zählt die Zählung auf der Kartenseite. Jeder Mapper gibt einen Wert aus, die Zählung. Dann müssen alle Werte aggregiert werden, um die Gesamtanzahl zu ergeben, und das ist die Aufgabe eines einzelnen Reduzierers.
select count(*) from
(select user
from some_table
group by user) q;
Diese Abfrage hat zwei Stufen. Auf Stufe 1 aggregiert GROUP BY die Benutzer auf der Kartenseite und gibt für jeden Benutzer einen Wert aus. Die Ausgabe muss dann auf der Reduzierungsseite aggregiert werden, , aber es kann viele Reduzierungen verwenden. Auf Stufe 2 wird die COUNT
auf der Kartenseite ausgeführt, und dann wird das Endergebnis mit einem einzigen Reduzierer aggregiert.
Wenn Sie also eine sehr große Anzahl von Kartenseitenaufteilungen haben, muss die erste Abfrage eine sehr große Anzahl von Ein-Wert-Ergebnissen aggregieren. Die zweite Abfrage kann viele Reduzierungen auf der reduzierten Seite von Stufe 1 verwenden und wird dann in Stufe 2 eine kleinere Aufgabe für den einzelnen Reduzierer am Ende haben.
Dies wäre normalerweise keine Optimierung. Sie müssten eine beträchtliche Anzahl von Kartenaufteilungen für den Abminderer der Abfrage 1 haben, um ein Problem zu werden. Die zweite Abfrage hat zwei Stufen, und die allein wäre langsamer als die Abfrage 1 (Stufe 2 kann erst beginnen, wenn Stufe 1 vollständig abgeschlossen ist). So, während ich einige Argumentation für den Rat sehen kann, den Sie haben, würde ich skeptisch sein, wenn die richtige Messung nicht gemacht wird und Verbesserungen zeigt.
Ich verstehe Ihre Frage nicht. Fragen Sie, warum die 'group by'-Version schneller ist? Wenn ja, warum glauben Sie, dass es schneller ist? Du hast es irgendwo gelesen oder hast es so gesehen? –
verwenden Sie einfach EXPLAIN – Bohdan