• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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索引的测试实例代码
    • oracle数据库关于索引建立及使用的详细介绍
    • Oracle Index索引无效的原因与解决方法
    • oracle使用索引与不使用索引的性能详析
    • ORACLE检查找出损坏索引(Corrupt Indexes)的方法详解
    • oracle分区索引的失效和重建代码示例
    • Oracle关于重建索引争论的总结
    • Oracle 分区索引介绍和实例演示
    • Oracle CBO优化模式中的5种索引访问方法浅析
    • oracle索引总结
    上一篇:Oracle密码过期如何取消密码180天限制及密码180天过期,账号锁住的问题
    下一篇:Oracle数据库空间满了进行空间扩展的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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