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

 更新时间:2018年02月07日 16:07:10   作者:Leohahah  
最近小编在群里讨论sql优化的问题,今天小编给大家带来了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复合索引与空值的索引使用问题小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Oracle12c的数据库向11g导进的方法

    Oracle12c的数据库向11g导进的方法

    这篇文章主要介绍了 Oracle12c的数据库向11g导进的方法的相关资料,需要的朋友可以参考下
    2016-03-03
  • oracle 数据库闪回相关语句介绍

    oracle 数据库闪回相关语句介绍

    本文将详细介绍oracle 数据库闪回相关语句,需要了解跟多的朋友可以参考下
    2012-11-11
  • Oracle 存储过程教程

    Oracle 存储过程教程

    一个简单的oracle分页存储过程的实现和调用。在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle的存储过程,因为我用到的数据库是oracle。
    2009-10-10
  • ORACLE创建DBlink的过程及使用方法

    ORACLE创建DBlink的过程及使用方法

    这篇文章主要介绍了ORACLE DBlink的创建和使用,本文通过实例代码给大家给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Linux 自动备份oracle数据库详解

    Linux 自动备份oracle数据库详解

    这篇文章主要介绍了Linux 自动备份oracle数据库详解方法的相关资料,数据库的备份的重要性,不言而喻,希望能帮到大家,需要的朋友可以参考下
    2016-10-10
  • VMware中linux环境下oracle安装图文教程(二)ORACLE 10.2.05版本的升级补丁安装

    VMware中linux环境下oracle安装图文教程(二)ORACLE 10.2.05版本的升级补丁安装

    这篇文章是VMware中linux环境下oracle安装图文教程系列的第二篇,主要介绍了ORACLE 10.2.05版本的升级补丁安装,需要的朋友可以参考下
    2014-08-08
  • oracle 10g 精简版安装步骤分享

    oracle 10g 精简版安装步骤分享

    今天遇到个软件要求安装oracle client端,于是考虑装精简版本的,以下是具体的安装步骤,特分享下,方便需要的朋友
    2014-06-06
  • 使用Oracle通过gateway连接MSSQL的详细流程

    使用Oracle通过gateway连接MSSQL的详细流程

    oracle Gateway是Oracle公司提供的一种访问非Oracle数据源的方法,它可以将非Oracle数据源(如SQLserver、mysql等)的数据看作是oracle数据库中的表,从而可以使用SQL和PLSQL等Oracle语言来访问这些数据,本文介绍了使用Oracle通过gateway连接MSSQL的详细流程
    2024-12-12
  • ORACLE中关于表的一些特殊查询语句

    ORACLE中关于表的一些特殊查询语句

    这篇文章主要介绍了ORACLE中关于表的一些特殊查询语句通过多种方式给大家介绍,在文末给大家提到了oracle的单表查询语句,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • 详解Oracle如何将txt文件中的数据导入数据库

    详解Oracle如何将txt文件中的数据导入数据库

    这篇文章主要介绍了Oracle如何将txt文件中的数据导入数据库,文中通过代码示例和图文结合的方式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03

最新评论