常見迷思:GROUP BY a, b 與 GROUP BY b, a 結果相同,效能是否也相同?
CREATE TABLE test(a VARCHAR2(20), b VARCHAR2(20), c NUMBER, d VARCHAR2(20));
INSERT INTO test VALUES('a1','b1',1,'t');
INSERT INTO test VALUES('a3','b3',3,'t');
INSERT INTO test VALUES('a4','b4',4,'t');
INSERT INTO test VALUES('a2','b2',2,'t');
INSERT INTO test VALUES('xx','xx',5,'x');
-- 重複插入一次,共 10 筆
COMMIT;
-- 寫法 1
SELECT a, b, SUM(c) FROM test WHERE d='t' GROUP BY a, b ORDER BY a, b;
-- 寫法 2
SELECT a, b, SUM(c) FROM test WHERE d='t' GROUP BY b, a ORDER BY a, b;
(a, b),GROUP BY a, b 可避免排序(Index Full Scan + Sort Group By Nosort)。EXPLAIN PLAN 實測為準,勿憑直覺。Oracle 10g+ 若 GROUP BY 欄位順序與 ORDER BY 一致,可省略排序步驟(SORT GROUP BY NOSORT),直接輸出有序結果。
分組欄位順序雖不改變結果,但透過索引順序對齊與選擇性排序,往往能帶來可觀的效能增益。