首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle GROUP BY 欄位順序對效能的影響實測

     編輯:Oracle 資料庫相關知識

常見迷思: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;

結論

  • 結果集完全相同:分組鍵集合無序,順序不影響聚合邏輯。
  • 執行計劃可能不同:Oracle 優化器可能根據欄位選擇性、索引存在與否、統計資訊,選擇不同的排序/雜湊分組策略。
  • 實務建議:
    – 將選擇性高(基數大)的欄位放前面,有助於 Hash Group By 提早過濾。
    – 若有複合索引 (a, b),GROUP BY a, b 可避免排序(Index Full Scan + Sort Group By Nosort)。
    – 配合 EXPLAIN PLAN 實測為準,勿憑直覺。

延伸:GROUP BY 與 ORDER BY 的關係

Oracle 10g+ 若 GROUP BY 欄位順序與 ORDER BY 一致,可省略排序步驟(SORT GROUP BY NOSORT),直接輸出有序結果。

分組欄位順序雖不改變結果,但透過索引順序對齊與選擇性排序,往往能帶來可觀的效能增益。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved