oracle 索引有空值,Oracle复合索引与空值的索引使用问题小结

昨天在QQ群里讨论一个sql优化的问题,语句大致如下:

sql;">

select A,min(B) from table group by A;--A,B都没有not null约束,A列无空值,B列有空值。--存在复合索引IX_TEST(A,B)

于是手动测试,环境采用Oracle自带的scott用户下的emp表。

1.首先查看如下语句的执行计划(此时表只有主键索引):

2018020716032637.png

2.添加IX_TEST(deptno,comm)后查看执行计划:

2018020716032638.png

2018020716032639.png

发现依然是全表扫描。

3.为deptno列添加非空约束后再次查看执行计划:

2018020716032640.png

2018020716032641.png

4.总结:

Btree索引是不存储空值的,这个是所有使用Btree索引的数据库的共同点。

在本例中我们创建了deptno,comm的符合索引。如果deptno没有非空约束,那么说明有的record不会出现在索引中,此时想要找到min(comm)就必须回表才能确定deptno为null的行是否有comm的值。此时优化器认为全表扫描比扫描索引再回表更为合理,因此选择全表扫描。

当我们添加了非空约束后,deptno不可能为空,因此索引的key值数等于表总行数,另一列comm即便为空也不影响min()取值,只需要扫描索引即可得到所需结果,此时优化器选择索引扫描。

而在MysqL中无论复合索引首列是否存在非空约束,都会使用索引,deptno为null的会全部分在一组取min(comm),可能是MysqL的BTREE索引与Oracle的有所不同,使得首列为空都可以无需回表。

最后:Oracle的列能添加非空约束的一定要添加。

总结

以上所述是小编给大家介绍的Oracle复合索引与空值的索引使用问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程之家网站的支持!

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值