如何优化Oracle索引,提升查询速度

本文通过三个案例分析了Oracle索引未被正确使用的情况,包括统计信息未收集导致的未使用索引、单独索引设计不合理和强制索引的使用。提供了解决这些问题的方法,如收集统计信息、创建复合索引和强制索引策略,以提高查询速度。

1 各类未正确使用索引案例

1.1 统计信息未收集案例
1.1.1 问题复现
–1、在test表中的name4字段上创建索引
create index idx_name4 on test(name4);
–2、按name4字段来进行查询
select * from test where name4>=‘reiku2171160’ and name4 <=‘wazhi9645963’;
–3、查看执行计划
在这里插入图片描述

1.1.2 未正确使用索引原因分析
上述查询在字段上创建了索引,使用该字段进行查询,查询执行计划发现未使用该字段的索引,初步分析可能由于统计信息未收集问题导致,通过如下语句查询,如果几列数据为空则代表未收集:
–4、查询表的统计信息是否收集
select num_rows,avg_row_len,last_analyzed from dba_tables where table_name=‘TEST’;
在这里插入图片描述

1.1.3 问题解决
经过分析,基本定位由于统计信息未收集,导致未使用索引;通过统计信息收集来解决类似问题,具体操作如下:
–5、表的统计信息收集
begin
dbms_stats.gather_table_stats(ownname=>‘TOMITY’,
tabname=>‘TEST’,
estimate_percent=>100,
method_opt=>‘for all indexed columns’ ,
cascade=>true,
degree=>4);
end;

–6、收集后,查看数据字典中的信息是否已更新
select num_rows,avg_row_len,last_analyzed from dba_tables where table_name=‘TEST’;
在这里插入图片描述

–7、查看执行计划
select * from test where name4>=‘reiku2171160’ and name4 <=‘wazhi9645963’;
在这里插入图片描述

1.2 索引设计不合理案例
1.2.1 问题复现
–1、在test表中的name4字段上创建索引
create index idx_name4 on test(name4);

–2、在test表中的name5字段上创建索引
create index idx_name5 on test(name5);

–3、查看执行计划
select * from test where name4=‘reiku2171160’ and name5=‘wazhi7487843’
在这里插入图片描述

1.2.2 未正确使用索引原因分析
查询条件name4,name5经常大量使用(首先与业务沟通,条件是否经常组合出现),但开发人员在两个字段上分别加上索引,执行时只能被使用到其中一个索引,导致执行效率下降,并且加大索引维护的成本。
1.2.3 问题解决
针对该类问题,应使用组合索引,删除原有的两个索引。具体操作如下:
–4、删除name4,name5上的两个索引
drop index idx_name4;
drop index idx_name5;

–5、创建name4,name5的复合索引
create index idx_name4name5 on test(name4,name5);

–6、查看执行计划
select * from test where name4=‘reiku2171160’ and name5=‘wazhi7487843’
在这里插入图片描述

1.3 强制索引案例
1.3.1 问题复现
–1、在test表中的name4字段上创建索引
create index idx_name4 on test(name4);

–2、在test表中的name5字段上创建索引
create index idx_name5 on test(name5);

–3、查看执行计划
select * from test where name4=‘reiku2171160’ and name5=‘wazhi7487843’
在这里插入图片描述

1.3.2 未正确使用索引原因分析
表中有两个索引idx_name4,idx_name5,与业务沟通,通过索引idx_name5执行,速度会更快,但由于ORACLE内部规划,使用了错误的索引执行,导致执行速度变慢。
1.3.3 问题解决
通过强制索引的方式,强制使用索引idx_name5,具体方法如下:
–3、强制走索引
select /*+index(t idx_name5) */ * from test t where name4=‘reiku2171160’ and name5=‘wazhi7487843’

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蚁库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值