Oracle中复合索引与空值的索引怎么用

这篇文章给大家分享的是有关Oracle中复合索引与空值的索引怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

创新互联建站主要从事网站设计制作、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务博野,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18982081108

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

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

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

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

Oracle中复合索引与空值的索引怎么用

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

Oracle中复合索引与空值的索引怎么用

Oracle中复合索引与空值的索引怎么用

发现依然是全表扫描。

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

Oracle中复合索引与空值的索引怎么用

Oracle中复合索引与空值的索引怎么用

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中复合索引与空值的索引怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


本文标题:Oracle中复合索引与空值的索引怎么用
链接地址:http://myzitong.com/article/goheis.html