Frage

Warum jemand eine Gruppe im Vergleich zu deutlichen verwenden würde, wenn es keine Aggregationen in der Abfrage durchgeführt werden?

Auch dann, wenn jemand weiß die Gruppe von im Vergleich zu deutlichen Leistungsinformationen in MySQL und SQL Server. Ich vermute, dass SQL Server eine bessere Optimierer hat und sie könnten auf gleichwertiges es nahe, aber in MySQL, erwarte ich einen deutlichen Leistungsvorteil deutlich.

Ich habe Interesse an dba Antworten.

EDIT:

Bills Post ist interessant, aber nicht anwendbar. Lassen Sie mich das konkretisieren ...

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

Vergleich

select distinct a,b,c
from table x
War es hilfreich?

Lösung

Ein wenig (sehr wenig) empirischen Daten aus MS SQL Server, auf ein paar zufälligen Tabellen aus unserer DB.

Für das Muster:

SELECT col1, col2 FROM table GROUP BY col1, col2

und

SELECT DISTINCT col1, col2 FROM table 

Wenn es kein abdeckenden Index für die Abfrage ist, erzeugen die beiden Möglichkeiten, um den folgenden Abfrage-Plan:

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

und wenn es ein abdeckenden Index, beide hergestellt:

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

so aus, dass sehr kleine Probe SQL Server sicher behandeln beide gleich.

Andere Tipps

GROUP BY ordnet Gruppen von Zeilen zu einer Zeile pro eindeutigem Wert in spezifische Spalten, die nicht notwendigerweise auch in der Auswahlliste sein.

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

Diese Abfrage ist legal SQL ( Korrektur: nur in MySQL, eigentlich ist es nicht Standard-SQL und nicht von anderen Marken unterstützt). MySQL akzeptiert, und er vertraut, dass Sie wissen, was Sie tun, die Auswahl b, c und d in eindeutiger Weise, weil sie funktionale Abhängigkeiten von a.

Allerdings, Microsoft SQL Server und andere Marken haben diese Abfrage nicht zulassen, weil sie die funktionalen Abhängigkeiten nicht leicht bestimmen kann. Bearbeiten Stattdessen Standard-SQL erfordert, dass Sie die folgen Einwertige Regel , dh jede Spalte in der Auswahlliste muss entweder in der GROUP BY Klausel benannt werden oder aber sein ein Argument für eine Set-Funktion.

Während DISTINCT sieht immer auf allen Spalten in der Auswahlliste, und nur die Spalten. Es ist ein verbreiteter Irrtum, dass DISTINCT können Sie die Spalten angeben:

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

Trotz der Klammern DISTINCT aussehen wie Funktionsaufruf zu machen, ist es nicht. Es ist eine Abfrage-Option und ein eindeutiger Wert in eines der drei Feldern der Auswahlliste wird im Abfrageergebnis zu einer deutlichen Reihe führen. Einer der Ausdrücke in dieser Auswahlliste hat Klammern um ihn herum, aber das wird das Ergebnis nicht beeinflussen.

In MySQL Ich habe festgestellt, als DISTINCT GROUP BY ist oft besser in der Leistung verwendet wird.

Doing eine zeigt "SELECT DISTINCT Explain" "Verwenden wo; Die Verwendung vorübergehend". MySQL wird eine temporäre Tabelle erstellen

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

Beide würden den gleichen Abfrageplan in MS SQL Server generieren .... Wenn Sie MS SQL Server Sie müssen nur den tatsächlichen Ausführungsplan ermöglichen könnten, um zu sehen, was für Ihre Bedürfnisse besser ist ...

Bitte haben Sie einen Blick auf diese Stellen:

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

Wenn Sie wirklich für verschiedene Werte suchen, die deutliche macht den Quellcode besser lesbar (wie wenn sie Teil einer gespeicherten Prozedur ist) Wenn ich schreibe Ad-hoc-Abfragen Ich werde in der Regel mit der Gruppe, beginnen sogar wenn ich keine Aggregationen, weil ich oft am Ende setze sie auf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top