首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 隱含參數 _gby_hash_aggregation_enabled 控制 Hash Group By 行為詳解

     編輯:Oracle 教學

Oracle 隱含參數 _gby_hash_aggregation_enabled 控制 Hash Group By 行為詳解

一、參數演進歷史

版本狀態
7.3.4 ~ 9.2.0不存在
10.1.0不存在
10.2.0 / 11.1.0引入,默認 TRUE,可 ALTER SESSION/SYSTEM 修改

二、兩種 GROUP BY 算法對比

  • SORT GROUP BY:傳統方式,先排序再聚合,產生 SORT (memory/disk) 統計。
  • HASH GROUP BY:10g 引入,構建哈希表聚合,避免排序,CPU 成本更低,統計顯示 0 sorts。

參數 _gby_hash_aggregation_enabled=TRUE(默認)啟用 Hash 聚合;設為 FALSE 退回 Sort 聚合。

三、實測演示

-- 建表並收集統計
CREATE TABLE t AS SELECT * FROM dba_users;
ANALYZE TABLE t COMPUTE STATISTICS;

-- CBO 模式下默認 Hash Unique
SELECT DISTINCT password FROM t;
-- Plan: HASH UNIQUE, 0 sorts

-- 關閉 Hash 聚合
ALTER SESSION SET "_gby_hash_aggregation_enabled" = FALSE;
SELECT DISTINCT password FROM t;
-- Plan: SORT UNIQUE, 1 sorts (memory)

四、已知 Bug 與規避

10gR2 中 Hash Group By 存在哈希碰撞導致結果不準確的 Bug(如 ORA-00600 [32695])。臨時規避:ALTER SESSION SET "_gby_hash_aggregation_enabled"=FALSE; 或在參數文件中永久關閉。

五、查看隱含參數通用腳本

SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc DESCRIB
FROM sys.x$ksppi x, sys.x$ksppcv y
WHERE x.inst_id = USERENV('Instance')
  AND y.inst_id = USERENV('Instance')
  AND x.indx = y.indx
  AND x.ksppinm LIKE '%gby%';
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved