對參數 optimizer_index_cost_adj 的一點理解_041009
2024-07-21 02:11:17
供稿:網友
參數optimizer_index_cost_adj設定了通過索引掃描和全表掃描之間的代價消耗關系,其默認值為100,表示oracle在計算查詢成本時,通過索引查找和全表掃描成本相等。該參數值越小,表明通過索引查找的代價越小,反之則越大。
通過以下試驗,演示該參數的用法。
1) 查看參數optimizer_index_cost_adj的當前值
sql> conn / as sysdba
connected.
sql> show parameter optimizer_index_cost_adj
name type value
------------------------------------ ----------- ---------
optimizer_index_cost_adj integer 100
--參數當前的默認值為100
sql>
sql> select isses_modifiable,issys_modifiable
2 from v$parameter
3 where name='optimizer_index_cost_adj';
isses issys_mod
----- ---------
true false
--說明該參數可以在session級別動態改變,
但不能在system級別動態改變
2) 創建表及索引,并對表進行分析
sql> conn scott/tiger
connected.
sql> create table test(a number,b char(10));
table created.
sql>
sql> begin
2 for i in 1..10000 loop
3 insert into test values(i,to_char(i));
4 end loop;
5 commit;
6 end;
7 /
pl/sql procedure successfully completed.
sql>
sql> create index idx_test_a on test(a);
index created.
sql>
sql> analyze table test compute statistics
2 for table
3 for all indexes
4 for all indexed columns;
table analyzed.
sql>
3)將參數optimizer_index_cost_adj設為100,查看相應的執行計劃
sql> set autotrace traceonly explain
sql> alter session set optimizer_index_cost_adj=100;
session altered.
sql> select * from test where a=1;
execution plan
----------------------------------------------------------
0 select statement optimizer=choose (cost=2 card=1 bytes=15)
1 0 table access (by index rowid) of 'test' (cost=2 card=1 byt
es=15)
2 1 index (range scan) of 'idx_test_a' (non-unique) (cost=1
card=1)
在以上部分中,oracle采用了正確的查找方法,使用索引來查找數據。
下面演示如何讓oracle采用全表掃描的方式來查找數據,雖然我們明知這種方式效率不高。
4) 改變參數optimizer_index_cost_adj為1000,改變oracle的決策過程
sql> alter session set optimizer_index_cost_adj=1000;
session altered.
sql> select * from test where a=1;
execution plan
----------------------------------------------------------
0 select statement optimizer=choose (cost=4 card=1 bytes=15)
1 0 table access (full) of 'test' (cost=4 card=1 bytes=15)
在以上演示中,通過改變optimizer_index_cost_adj參數,oracle采用全表掃描來執行同樣的查詢。
5)總結
在oltp系統中,可以考慮將optimizer_index_cost_adj參數值設小,使系統傾向于使用索引;在dss系統中,則可以考慮適當將該參數調大,影響oracle的決策過程。
網站運營seo文章大全提供全面的站長運營經驗及seo技術!