mysql - sql group by



SQL-Gruppe von versus distinct (4)

Beide würden den gleichen Abfrageplan in MS SQL Server erzeugen .... Wenn Sie MS SQL Server haben, könnten Sie einfach den tatsächlichen Ausführungsplan aktivieren, um zu sehen, welcher für Ihre Bedürfnisse besser ist ...

Bitte sehen Sie sich diese Beiträge an:

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

Warum sollte jemand eine Gruppe nach versus distinct verwenden, wenn in der Abfrage keine Aggregationen vorgenommen wurden?

Außerdem kennt jemand die Gruppe im Vergleich zu unterschiedlichen Leistungsüberlegungen in MySQL und SQL Server. Ich nehme an, dass SQL Server einen besseren Optimierer hat und sie könnten dort fast gleichwertig sein, aber in MySQL erwarte ich einen deutlichen Leistungsvorteil.

Ich bin an dba Antworten interessiert.

BEARBEITEN:

Bills Post ist interessant, aber nicht anwendbar. Lass mich genauer sein ...

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

gegen

select distinct a,b,c
from table x

Answer #1

Ein wenig (sehr wenig) empirische Daten von MS SQL Server, auf ein paar Zufallstabellen aus unserer Datenbank.

Für das Muster:

SELECT col1, col2 FROM table GROUP BY col1, col2

und

SELECT DISTINCT col1, col2 FROM table 

Wenn für die Abfrage kein überdeckender Index vorhanden ist, wurde der folgende Abfrageplan auf beide Arten erstellt:

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

und wenn es einen Deckungsindex gab, produzierten beide:

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

also von diesem sehr kleinen Beispiel behandelt SQL Server sicherlich beide gleich.


Answer #2

GROUP BY ordnet Gruppen von Zeilen einer Zeile zu, je nach Wert in bestimmten Spalten, die nicht notwendigerweise in der Auswahlliste enthalten sein müssen.

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

Diese Abfrage ist legales SQL ( Korrektur: nur in MySQL; eigentlich ist es kein Standard-SQL und wird nicht von anderen Marken unterstützt). MySQL akzeptiert es und vertraut darauf, dass Sie wissen, was Sie tun, indem Sie b , c und d auf eindeutige Weise auswählen, weil sie funktionale Abhängigkeiten von a .

Microsoft SQL Server und andere Marken lassen diese Abfrage jedoch nicht zu, da die funktionalen Abhängigkeiten nicht einfach ermittelt werden können. edit: Bei Standard-SQL müssen Sie stattdessen der Einzelwertregel folgen, dh jede Spalte in der Select-Liste muss entweder in der GROUP BY Klausel benannt sein oder ein Argument für eine set-Funktion sein.

Während DISTINCT immer alle Spalten in der Auswahlliste und nur diese Spalten betrachtet. Es ist ein häufiges Missverständnis, dass DISTINCT Ihnen erlaubt, die Spalten zu spezifizieren:

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

Trotz der Klammern, die DISTINCT wie Funktionsaufruf aussehen lassen, ist dies nicht der DISTINCT . Es ist eine Abfrageoption und ein eindeutiger Wert in einem der drei Felder der Auswahlliste führt zu einer bestimmten Zeile im Abfrageergebnis. Einer der Ausdrücke in dieser Auswahlliste enthält runde Klammern. Dies hat jedoch keine Auswirkungen auf das Ergebnis.


Answer #3

In MySQL habe ich festgestellt, dass die Verwendung von GROUP BY oft besser ist als DISTINCT.

Wenn Sie "EXPLAIN SELECT DISTINCT" ausführen, wird "Verwendung von where; Mit temporary" angezeigt, um eine temporäre Tabelle zu erstellen.

vs a "EXPLAIN SELECT a, b, c aus T1, T2 wobei T2.A = T1.A GROUP BY a" zeigt nur "Verwendung wo"





distinct