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