一个参数引发的血案

[复制链接]
查看11 | 回复9 | 2008-8-4 21:31:40 | 显示全部楼层 |阅读模式
新来公司,查看公司以前的故障文档,发现了这么一条:oracle原厂的人对生产库进行了参数调整,其中有一个参数为_no_or_expansion,默认值为false,被他们改成true。这条参数的作用是,在where条件后,本来是可以使用or条件,在这个参数的作用下,不会扩展成inlist,原来的是索引扫描,那么现在就是全表扫描。
然后问题随之而来,库中有个最大的表,约为11亿条记录,恰好是用or写的条件,原来是index range scan,现在是full table scan。
修改这个参数后,一切恢复正常。
oracle原厂的人的解释是:OR expansion during optimization disabled. Very long inlists can cause problems for the Cost Based Optimizer especially when the inlist is expanded into a large number of UNION ALLed statements.
关键现在的系统根本不存在他们说的这种情况,他们调整的依据是什么呢?如果真的有这种情况,我估计我最多加个no_expand,还没有想过用隐含参数来控制。
同时问大家下,自己的库,都用什么隐含参数了?
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
以前也遇到过oracle乱做or扩展导致的效率问题,开始也设置这参数,但是影响太大还是取消了,最后还是改了sql,加hint避免or扩展
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
血案,当时死人了吧?
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
没死人,但是机器快down了
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
有些参数也是有适用范围的。这玩意没有万能的。
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
怎么就没听过这个参数啊
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
改这样的参数的确应该慎重。
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
ask oracle why they changed _no_or_expansion before
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
学习楼主的事故经验,避免自己以后脑子一热犯错。不过感觉Oracle厂商有些建议主要是通过参数或者一些表分析去进行修改这些的,但很多问题的根源我自己感觉还是在表的数据量,索引创建合理,sql语句的写法这几个方面。

清晨起来,空气清新,继续昨天突然接的任务,帮研发修改存储过程及sql脚本,普通表亿万级和千万级做表关联的相关查询结果去更新另外张千万级的表相关字段结果的sql,看得我头大,继续分析及整理优化思路。
回复

使用道具 举报

千问 | 2008-8-4 21:31:40 | 显示全部楼层
又学了一个隐含参数,谢了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行