• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

对参数 optimizer_index_cost_adj 的一点理解_041009

发布: 2007-7-02 11:08 | 作者: admin | 来源: | 查看: 10次 | 进入软件测试论坛讨论

领测软件测试网
参数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的决策过程。

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网