oracle 优化器 失效,Oracle优化器模式不同导致索引失效

本文探讨了Oracle数据库中ALL_ROWS与RULE优化器模式对索引效能的影响,特别是当查询涉及冗余索引时。通过实例解析,理解了RBO如何因索引设计导致效率降低,而CBO则更为灵活。优化建议针对特定模式调整索引策略以提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5268f80b9b1e01f982625ef6fac83ca1.png

INDEX idx_datetime ON my_Table(init_date,curr_date,update_time) TABLESPACE MY_IDX

这个语句增加了由三个字段组成的索引。相同的索引,在A数据库有效,而在B数据库无效,怀疑是数据库优化器的模式不同。

使用以下语句查看数据库优化器模式。

Show parameter opti;

b57867e72b5839a479081b508266aa72.png

其中,A数据库的模式是ALL_ROWS。

0730adeaed9213acc685b0c022768c73.png

B数据库的优化器模式是RULE。

Oracle的优化器有两种,基于规则的优化器(RBO)和基于代价的优化器(CBO)。上述例子中的ALL_ROWS是基于代价的优化器CBO,RULE是基于规则的优化器RBO。

RBO有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说RBO对数据不“敏感”;它根据ORACLE指定的优先顺序规则,对指定的表进行执行计划的选择。在RBO中,SQL的写法往往会影响执行计划。上述例子中,数据库B用的是RBO优化器。我们来看看用于测试的查询语句。

1 select count(*) ascount_n2 frommy_Table3 where ((curr_date = 20200525 and update_time <= 153000)4 or (curr_date = (select max(a.init_date) from your_Table a where a.init_date < 20200525) and update_time > 153000)5 or (curr_date > (select max(a.init_date) from your_Table a where a.init_date < 20200525) and curr_date < 20200525))

在这个查询语句中,实际用于过滤my_Table表的是curr_date和update_time两个字段,而新增索引中有三个字段[init_date, curr_date, update_time],多了一个init_date字段,导致RBO模式下判定第一个字段无用,从而使整个索引失效。

因此,对于RBO优化器模式来说,想提高这个查询的速度,有效的索引是[curr_date, update_time],修改索引后再进行查询,速度明显提高。

而CBO优化器模式相对灵活,它会根据SQL语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(Plan Generator)生成执行计划,比较执行计划的代价,最终选择选择一个代价最小的执行计划。使用原先的三个字段作为索引,也不会有问题。

Oracle优化器模式不同导致索引失效

标签:pre   oracle优化   all_rows   例子   模式   from   就是   where   enter

1428d0e076c3959ab11d28a39bc84fab.png

5268f80b9b1e01f982625ef6fac83ca1.png

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/yukifun/p/13024684.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值