主页 > 知识库 > Oracle复合索引与空值的索引使用问题小结

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

热门标签:400电话是不是免费申请 呼伦贝尔智能手机地图标注 济南地图标注公司 海南400电话哪里办理 安阳外呼系统免费 分布式呼叫中心 图像地图标注 南宁人工智能电销机器人费用 贵阳电话外呼系统哪家好

昨天在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索引的测试实例代码
  • oracle数据库关于索引建立及使用的详细介绍
  • Oracle Index索引无效的原因与解决方法
  • oracle使用索引与不使用索引的性能详析
  • ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解
  • oracle分区索引的失效和重建代码示例
  • Oracle关于重建索引争论的总结
  • Oracle 分区索引介绍和实例演示
  • Oracle CBO优化模式中的5种索引访问方法浅析
  • oracle索引总结

标签:焦作 郴州 滁州 南充 许昌 合肥 凉山 辽源

巨人网络通讯声明:本文标题《Oracle复合索引与空值的索引使用问题小结》,本文关键词  Oracle,复合,索引,与,空值,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《Oracle复合索引与空值的索引使用问题小结》相关的同类信息!
  • 本页收集关于Oracle复合索引与空值的索引使用问题小结的相关信息资讯供网民参考!
  • 推荐文章