Trotz der Aussagen in der MSDN-Dokumentation ist dies für GROUP BY
Abfragen nicht wichtig .
Sie können es hier testen unter: SQL-Fiddle-Test (SQL-Server 2012)
CREATE TABLE test
( id INT IDENTITY(1,1)
, a INT NOT NULL
, b INT NOT NULL
, c INT NOT NULL
, d INT NOT NULL
, PRIMARY KEY (id)
) ;
CREATE NONCLUSTERED INDEX a_b_c_include_d_index
ON test (a, b, c)
INCLUDE (d) ;
INSERT INTO test
(a, b, c, d)
VALUES
... some 50K rows
Die Fragen:
SELECT COUNT(*) AS num
, MIN(cnt) AS min_count
, MAX(cnt) AS max_count
, MIN(min_d) AS min_min_d
, MAX(min_d) AS max_min_d
, MIN(max_d) AS min_max_d
, MAX(max_d) AS max_max_d
FROM
( SELECT a
, b
, c
, COUNT(d) AS cnt
, MIN(d) AS min_d
, MAX(d) AS max_d
FROM test
GROUP BY a, b, c --- or with: `GROUP BY b, a, c`
) AS grp ;
den gleichen Ausführungsplan erstellen:
MICROSOFT SQL SERVER 2005 XML SHOWPLAN
SELECT
Compute Scalar
Cost: 0%
Stream Aggregate
(Aggregate)
Cost: 0%
Compute Scalar
Cost: 10%
Stream Aggregate
(Aggregate)
Cost: 10%
Index Scan
[a_b_c_include_d_index].[test]
Cost: 89%
Wenn Sie diese Gruppe nun ändern in:
GROUP BY a, b, c
WITH ROLLUP
es macht einen Unterschied und es erzeugt unterschiedliche Ausführungspläne (und natürlich unterschiedliche Ergebnismengen). Zumindest in diesem SQL-Fiddle-Test wird der Index jedoch weiterhin verwendet. Im Fall einer nicht übereinstimmenden Reihenfolge werden die Daten aus dem Index abgerufen, es muss jedoch eine Zwischensortierung durchgeführt werden (um die Rollup-Werte zu berechnen).
GROUP BY "First Name", "Last Name"
ist das gleiche wieGROUP BY "Last Name", "First Name"
nein? Nach WHERE und ON spielt die Reihenfolge keine Rolle. Für ORDER BY ist dies der Fall