您现在的位置是:网站首页> 编程资料编程资料
Oracle复合索引与空值的索引使用问题小结_oracle_
2023-05-27
390人已围观
简介 Oracle复合索引与空值的索引使用问题小结_oracle_
昨天在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复合索引与空值的索引使用问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
相关内容
- Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题_oracle_
- JDBC Oracle执行executeUpdate卡死问题的解决方案_oracle_
- oracle中where 子句和having子句中的区别介绍_oracle_
- Oracle查询当前的crs/has自启动状态实例教程_oracle_
- oracle中的greatest 函数和 least函数示例代码_oracle_
- ORACLE中关于表的一些特殊查询语句_oracle_
- ORACLE中查找定位表最后DML操作的时间小结_oracle_
- Orancle的SQL语句之多表查询和组函数_oracle_
- Oracle中定义以及使用同义词的方法_oracle_
- Oracle数据库新装之后出现的监听程序无法正常启动和运行(Oracle-12514)问题_oracle_
