ORACLE 提供了基於成本(CostBased)和基於規則(RuleBased)兩種最佳化器,簡稱為CBO和RBO,用於確定查詢操作的執行計畫。
一、如何使用CostBased最佳化器最佳化查詢操作?
如何使用CBO,那麼首先要理解這些概念
1、CBO的成本計算的依據
(1)統計資訊:與SQL語句所引用的對象相關以及主機的CPU和IO
(2)SQL語句本身
(3).環境:例如與最佳化器相關的參數設定
2、最佳化器目標:optimizer_mode
(1)ALL_ROWS
(2)FIRST_ROWS_N
3、選擇率和基數
4、聚簇因子
5、查詢轉換
(1)視圖合并(view merge)
(2)謂詞推進(Predicate Pushing)
(3)子查詢非嵌套化(Subquery Unnesting)
(4)OR條件展開
6、綁定變數與長條圖
7、收集統計資訊
二、為什麼CostBased最佳化器的執行計畫不是最好的?
CostBased最佳化器本身也是個智能軟體,肯定有陷缺,RBO(Rule-Based Optimizer)可以在某種程度上彌補CBO在效能上的缺陷。
三、為什麼CostBased的查詢有時候效能很好,有時候卻突然的變慢呢?
1、有可能是以下原因
(1)統計資訊不正確,這是關鍵所在
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/
(2)與最佳化器相關的參數設定的不太合理,如下參數
optimizer_features_enable
optimizer_index_caching
optimizer_index_cost_adj
optimizer_mode
db_{keep_|recycle_|nk_}cache_size
db_block_size
db_file_multiblock_read_count
hash_area_size
memory_target
parallel_threads_per_cpu
pga_aggregate_target
sort_area_size
sga_target
(3)sql語句的編寫
例如一個複雜的sql有幾十張表相連,CBO就不一定能正確串連表的順序了,這時需要用Hint固定順序。。。
2、用以下方法改變執行計畫
(1)修改sql本身,如用Hints提示等
(2)穩固計劃
(3)使用sql概要(sqlprofile)
(4)改變統計資訊
(5)設定最佳化器模式相關的參數
(6)使用基準(baseline)