天天看點

修改隐含參數造成SQL性能下降案例之三

周末,繼續放輕松,了解點常識。

經常在客戶的生産系統發現_gby_hash_aggregation_enabled 這個參數被設定成false,對于一般的中小系統,資料量相對較少,這個參數的影響不會太大。如果資料量比較大,性能的差距就比較明顯了,下面是在某個客戶現場實測的資料。

設定 _gby_hash_aggregation_enabled = false,SQL執行時間接近10分鐘:

修改隐含參數造成SQL性能下降案例之三

設定 _gby_hash_aggregation_enabled = TRUE,SQL執行時間5分鐘多一點,性能相差接近1倍:

修改隐含參數造成SQL性能下降案例之三

注:為了減少資料緩存産生的誤差,每個SQL都執行了兩次,時間相差可以忽略不計。

再來看看兩種情況的執行計劃對比:

_gby_hash_aggregation_enabled = false,使用Sort group by:

修改隐含參數造成SQL性能下降案例之三

_gby_hash_aggregation_enabled = True,使用Hash group by:

修改隐含參數造成SQL性能下降案例之三

這就是為什麼不建議将一些性能相關的優化器參數關閉的原因了。

_gby_hash_aggregation_enabled 這個隐含參數在10g的較早版本可能存在bug,被設定成了false;很多客戶更新到11g後,仍保持該參數為false,建議檢查bug修複清單,如果相關bug已修複,建議設定該參數為TRUE。

如果遇到某些特定SQL确實遇到了bug,可以在SQL級别關閉該參數:

如 select /*+ OPT_PARAM('_gby_hash_aggregation_enabled' 'false') */ ......

也可以使用sql profile,不用修改SQL代碼,也可以讓參數設定生效。