如
果哪天你遇到特殊的情况,比如系统数据字典的索引坏了,但是你去没有办法去修改这个索引,因为有些系统内部的东西你是动不了的
你就会说“我要是能绕过这个索引,全部走全表扫描,把库里的数据全部导出来该多好啊”
那么,这个时候,optimizer_index_cost_adj就很有用了
该参数表示全表扫描和索引扫描的百分比,取值范围∈[1,10000],缺省为100
告诉优化器:走索引和走全表扫描的代价的比值是多少
OPTIMIZER_INDEX_CACHING参数是用来告诉Oracle一个索引被高速缓存的百分比的参数
OPTIMIZER_INDEX_COST_ADJ参数是用来告诉Oracle高速缓存多少表数据的参数
这个数越小,表访问单个块的成本就越低;反之,这个数越大,成本就越高
理解这个参数的一种办法是想像这个表反映多块I/O(与全表扫描)的成本与执行单块I/O(与索引读取有关)的成本
如果保持这个参数为默认的设置100,则多块I/O与单块I/O的成本相同
设置这个值为50导致优化程序考虑单块表访问的成本为多块I/O的一半,有效地把表访问的成本减为原来的一半
对Oracle而言,这个缺省值通常需要调整
一般来说,optimizer_index_caching可以设置为90左右
对于大多数OLTP,optimizer_index_cost_adj可以设置在10~50之间
对于OLAP和DSS系统,可能无法简单的把optimizer_index_cost_adj设置为50
通常我们可以根据统计信息,db file scattered reads/db file sequential reads来计算
你就会说“我要是能绕过这个索引,全部走全表扫描,把库里的数据全部导出来该多好啊”
那么,这个时候,optimizer_index_cost_adj就很有用了
该参数表示全表扫描和索引扫描的百分比,取值范围∈[1,10000],缺省为100
告诉优化器:走索引和走全表扫描的代价的比值是多少
默认值100意味着索引访问与全表扫描是完全等价的
sys@ORCL> show parameter optimizer_index
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 100
OPTIMIZER_INDEX_CACHING参数是用来告诉Oracle一个索引被高速缓存的百分比的参数
OPTIMIZER_INDEX_COST_ADJ参数是用来告诉Oracle高速缓存多少表数据的参数
这个数越小,表访问单个块的成本就越低;反之,这个数越大,成本就越高
理解这个参数的一种办法是想像这个表反映多块I/O(与全表扫描)的成本与执行单块I/O(与索引读取有关)的成本
如果保持这个参数为默认的设置100,则多块I/O与单块I/O的成本相同
设置这个值为50导致优化程序考虑单块表访问的成本为多块I/O的一半,有效地把表访问的成本减为原来的一半
对Oracle而言,这个缺省值通常需要调整
一般来说,optimizer_index_caching可以设置为90左右
对于大多数OLTP,optimizer_index_cost_adj可以设置在10~50之间
对于OLAP和DSS系统,可能无法简单的把optimizer_index_cost_adj设置为50
通常我们可以根据统计信息,db file scattered reads/db file sequential reads来计算
--创建测试表
sys@ORCL> drop table t purge;
Table dropped.
sys@ORCL> create table t as select * from dba_objects;
Table created.
sys@ORCL> create index idx_t on t (owner);
Index created.
sys@ORCL> analyze table t compute statis