引數Optimizer_index_cost_adj 對執行計劃的影響
引數Optimizer_index_cost_adj對執行計劃的影響
在基於cbo的優化器模式下面,oracle會把sql語句的各種執行計劃的成本做比較,取其最小的作為其最優執行計劃,同時,在決定是用index scan 還是full table scan 訪問一個表的時候,oracle會把index scan的執行成本轉化為fts的成本,然後再根據其成本大小來決定執行計劃,這個index scan 和full table scan 的比值即為 optimizer_index_cost_adj,下面的例子具體說明了該引數的不同取值對執行計劃的影響(下面的例子不能做為效能調整的根據,只是作為該引數的一個研究型文件,實際在調整該引數的時候,還是參考應用的型別(oltp/olap),及v$system_event 中的db file sequential read,db file scattered read的具體數值。
建立測試表
SQL> create table t as select * from dba_objects;
SQL> create index t_idx on t(owner);
SQL> SHOW PARAMETER OPTIMIZER_INDEX_COST_ADJ
NAME TYPE VALUE
------------------------------------ ----------- -----
optimizer_index_cost_adj integer 100
SQL> SHOW PARAMETER DB_FILE
NAME TYPE VALUE
------------------------------------ ----------- -----
db_file_multiblock_read_count integer 16
SQL> set autotrace traceonly explain;
SQL> select * from t where wner='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=19 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=19 Card=1060 Bytes=91160)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Card=1060)
SQL> select /*+ FULL(T) */ * FROM T WHERE WNER='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=41 Card=1060 Bytes=91160)
預設的optimizer_index_cost_adj =100,全表掃描及索引範圍掃描的成本19,41,此時索引掃描的成本要比全表掃描的成本低,調整optimizer_index_cost_adj 引數,調整的基點: 全表掃描成本/索引掃描成本
SQL> SELECT 41/19*100 FROM DUAL;
41/19
----------
215.789474
SQL> SET AUTOTRACE OFF;
先取一個稍微大於此基點的整數
SQL> ALTER SESSION SET OPTIMIZER_INDEX_COST_ADJ=216;
會話已更改。
SQL> set autotrace traceonly explain;
SQL> SET AUTOTRACE OFF;
SQL> SHOW PARAMETER OPTIMIZER_INDEX_COST_ADJ
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_index_cost_adj integer 216
SQL> set autotrace traceonly explain;
SQL> select * from t where wner='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=41 Card=1060 Bytes=91160)
此時走了全表掃描,成本為41,再看索引掃描的成本是多少
SQL> SELECT /*+ INDEX(T T_IDX) */ * FROM t where wner='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=42 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=42 Card=1060 Bytes=91160)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Card=1060)
索引的成本變為42了,索引優化器選擇了全表掃描(42=ceil(19*2.16))
再來看看把該引數的值降低一點點,是否又走索引了呢?
SQL> ALTER SESSION SET OPTIMIZER_INDEX_COST_ADJ=214;
會話已更改。
SQL> SELECT 2.14*19 FROM DUAL;
2.14*19
----------
40.66
SQL> select * from t where wner='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=41 Card=1060 Bytes=91160)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Card=1060)
此時的確走了索引掃描,成本為41(2.14*19=40.66),前面看到全表掃描的成本也是41,如果再調小一點,索引鎖秒的成本就會變為40,結果會更明顯一點
SQL> ALTER SESSION SET OPTIMIZER_INDEX_COST_ADJ=210;
會話已更改。
SQL> select * from t where wner='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=40 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=40 Card=1060 Bytes=91160)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3 Card=1060)
SQL> select /*+ FULL(T) */ * FROM T WHERE WNER='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=1060 Bytes=91160)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=41 Card=1060 Bytes=91160)
再看降低索引掃描相對於全表掃描的成本的比例因子,來降低索引掃描的成本,情況類似,簡單列出
SQL> select * from t where owner>='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=41 Card=23670 Bytes=2035620)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=41 Card=23670 Bytes=2035620)
SQL> select /*+ INDEX(T T_IDX) */ * FROM t where owner>='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=397 Card=23670 Bytes=2035620)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=397 Card=23670Bytes=2035620)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=57 Card =23670)
設定optimizer_index_cost_adj=trunc(41/397 *100)=10
SQL> ALTER SESSION SET OPTIMIZER_INDEX_COST_ADJ=10;
會話已更改。
SQL> select * from t where owner>='HR';
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=40 Card=23670 Bytes=2035620)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=40 Card=23670 Bytes=2035620)
2 1 INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=57 Card=23670)
(注:本文是在參考了eygle大師的資料情況下做的實驗)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10159839/viewspace-206270/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- cluster factor對執行計劃的影響
- 索引及排序對執行計劃的影響索引排序
- oracle cardinality對於執行計劃的影響Oracle
- not-null約束對執行計劃的影響Null
- 【CURSOR】Oracle繫結變數、執行計劃對遊標的影響Oracle變數
- db_file_multiblock_read_count引數對block讀取和執行計劃的影響BloC
- Oracle優化案例-統計資訊對執行計劃的影響(十三)Oracle優化
- 實驗-資料分佈對執行計劃的影響.txt
- _complex_view_merging對執行計劃的影響View
- CLUSTERING_FACTOR影響執行計劃
- 收集統計資訊中的no_invalidate選項對執行計劃的影響
- 再說索引與Null值對於Hints及執行計劃的影響索引Null
- 執行緒數目對資料庫的影響執行緒資料庫
- 不等號影響執行計劃的相關實驗
- 雙下劃線開頭的記憶體引數對Oracle AMM行為的影響記憶體Oracle
- JVM 引數調整對 sortx 的影響JVM
- 表挪動儲存空間後,對之上的sql的執行計劃的影響的探究SQL
- table_open_cache引數對mysql效能的影響MySql
- ASP中函式呼叫對引數的影響 (轉)函式
- try catch 對程式碼執行的效能影響
- Kafka之acks引數對訊息持久化的影響Kafka持久化
- Oracle 執行計劃中一些引數的含義Oracle
- optimizer_index_cost_adj和optimizer_index_caching對CBO的影響Index
- pg中與執行計劃相關的配置(ENABLE_*)引數
- 時區調整對job的執行時間的影響
- MySQL:slave_skip_errors引數對MGR可用性的影響MySqlError
- 11g MEMORY_TARGET 引數對SGA 和PGA的影響
- 11g MEMORY_TARGET 引數對SGA 和PGA的影響
- 引數 optimizer_index_cost_adjIndex
- 影響執行計劃之oracle sql baseline與sql profile之互動OracleSQL
- optimizer_index_cost_adj引數的作用Index
- Java教程:影響MySQL效能的配置引數JavaMySql
- 對一個執行計劃的疑問
- 各平臺影響oracle Process數的引數(轉)Oracle
- arraysize/TDU/SDU的設定對sql執行代價的影響SQL
- 瞭解 ignore_above 引數對 Elasticsearch 中磁碟使用的影響Elasticsearch
- oracle 索引升降序及排序條件 對查詢計劃的影響Oracle索引排序
- MySQL選用可重複讀之前一定要想到的事情(執行計劃影響)MySql