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

62次阅读
没有评论

共计 828 个字符,预计需要花费 3 分钟才能阅读完成。

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

在 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. 首先查看如下语句的执行计划(此时表只有主键索引):

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

发现依然是全表扫描。

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

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计828字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)