查看原表:

  1. SQL> select count(*) from t1;
  2.  
  3. COUNT(*)
  4. ----------
  5. 3229088
  6.  
  7. SQL> select count(*) from t1 where object_id is null;
  8.  
  9. COUNT(*)
  10. ----------
  11. 32
  12.  
  13. SQL>

创建单键索引:

  1. SQL> create index idx_t1 on t1(object_id);
  2. SQL> alter system flush buffer_cache;
  3. SQL> set timing on
  4. SQL> set autot traceonly
  5. SQL> select * from t1 where object_id is null;
  6.  
  7. 32 rows selected.
  8.  
  9. Elapsed: 00:00:00.21
  10.  
  11. Execution Plan
  12. ----------------------------------------------------------
  13. Plan hash value: 3617692013
  14.  
  15. --------------------------------------------------------------------------
  16. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  17. --------------------------------------------------------------------------
  18. | 0 | SELECT STATEMENT | | 499 | 78842 | 12320 (1)| 00:02:28 |
  19. |* 1 | TABLE ACCESS FULL| T1 | 499 | 78842 | 12320 (1)| 00:02:28 |
  20. --------------------------------------------------------------------------
  21.  
  22. Predicate Information (identified by operation id):
  23. ---------------------------------------------------
  24.  
  25. 1 - filter("OBJECT_ID" IS NULL)
  26.  
  27. Note
  28. -----
  29. - dynamic sampling used for this statement (level=2)
  30.  
  31. Statistics
  32. ----------------------------------------------------------
  33. 5 recursive calls
  34. 0 db block gets
  35. 45453 consistent gets
  36. 45585 physical reads
  37. 0 redo size
  38. 2195 bytes sent via SQL*Net to client
  39. 546 bytes received via SQL*Net from client
  40. 4 SQL*Net roundtrips to/from client
  41. 0 sorts (memory)
  42. 0 sorts (disk)
  43. 32 rows processed
  44.  
  45. SQL>

对于普通的单键值B树索引而言,null值不入索引。所以即使在object_id上有单键值B树索引,在执行"select * from t1 where object_id is null"时也用不上索引。上述查询分别消耗了4w多的逻辑读和逻辑读。

创建复合索引:

  1. SQL> drop index idx_t1;
  2. SQL> create index idx_t1 on t1(object_id,0);
  3. SQL> alter system flush buffer_cache;
  4. SQL> select * from t1 where object_id is null;
  5.  
  6. 32 rows selected.
  7.  
  8. Elapsed: 00:00:00.00
  9.  
  10. Execution Plan
  11. ----------------------------------------------------------
  12. Plan hash value: 50753647
  13.  
  14. --------------------------------------------------------------------------------------
  15. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  16. --------------------------------------------------------------------------------------
  17. | 0 | SELECT STATEMENT | | 32 | 3136 | 35 (0)| 00:00:01 |
  18. | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 32 | 3136 | 35 (0)| 00:00:01 |
  19. |* 2 | INDEX RANGE SCAN | IDX_T1 | 32 | | 3 (0)| 00:00:01 |
  20. --------------------------------------------------------------------------------------
  21.  
  22. Predicate Information (identified by operation id):
  23. ---------------------------------------------------
  24.  
  25. 2 - access("OBJECT_ID" IS NULL)
  26.  
  27. Statistics
  28. ----------------------------------------------------------
  29. 0 recursive calls
  30. 0 db block gets
  31. 38 consistent gets
  32. 35 physical reads
  33. 0 redo size
  34. 2195 bytes sent via SQL*Net to client
  35. 546 bytes received via SQL*Net from client
  36. 4 SQL*Net roundtrips to/from client
  37. 0 sorts (memory)
  38. 0 sorts (disk)
  39. 32 rows processed
  40.  
  41. SQL>

创建复合索引后,物理读和逻辑读变成40多。

使用复合索引代替单键索引,来避免单键有null值的情况的更多相关文章

  1. Oracle中NULL值与索引

    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的.由于NULL存在着无数的可能,因此NULL值也不等于 ...

  2. 【Java基础】ConcurrentHashMap为什么不能存null键和null值

    代码如下 /** * 测试ConcurrentHashMap null键和null值的问题 * @return */ @RequestMapping(value = "/get_nacos& ...

  3. mongodb索引 单键索引

    单键索引是最普通的索引,比如一条记录,形式为{x:1,y:2,z:3},我们在x上建立索引,之后就可以以x为条件进行查询,与_id索引不同,单键索引不会自动创建 创建索引 > db.test2. ...

  4. Mysql 复合键索引性能

    数据库的常见的索引一般是单个字段,如果多个字段的组合,那么就组成了复合索引.对于组合索引,如果 对其中一字段做为条件查询,会出现什么情况呢? 一.例子 mysql> show create ta ...

  5. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

  6. mysql索引之主键索引

    MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 二.语句 CREATE TABLE table_name[col_name data type] [ ...

  7. SQL存储原理及聚集索引、非聚集索引、唯一索引、主键约束的关系(补)

    索引类型 1.          唯一索引:唯一索引不允许两行具有相同的索引值 2.          主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型.主键索引要求主键中的 ...

  8. 1226关于count(*)不走主键索引反而走二级索引

    转自 http://www.2cto.com/database/201508/433975.html mysqlcount(*)会选哪个索引? 2015-08-19      0个评论    来源:D ...

  9. 修改mysql表结构,添加一个主键索引自增字段,修改原来的主字段为普通字段

    原来有一个字段id,为自增,主键,索引.现在要新增一个字段s_id为自增,主键,索引.同时把原来的主字段改成普通字段,默认值为0. Alter table e_diamond_jhds change ...

随机推荐

  1. Codeforces Round #228 (Div. 2) A. Fox and Number Game

    #include <iostream> #include <algorithm> #include <vector> #include <numeric> ...

  2. IP地址分类整理

    什么是IP地址? IP地址就是计算机在网络中地址. IP地址有多少个? IP地址范围是:0.0.0.0~225.225.225.255,这只是人为了方便记录才转为十进制的,ip地址实际是一个32位地址 ...

  3. sql:select赋值和set赋值的区别

    1)Set写法 declare @i integer set @i=(select count(*) from test) select @i Select写法 declare @i integer ...

  4. windows自带的压缩,解压缩命令

    压缩一个文件: makecab c:\ls.exe ls.zip 解压一个文件: expand c:\ls.zip c:\ls.exe

  5. zju(3)内核编译与运行

    1.实验目的 学习和掌握Linux配置和编译的基本步骤. 二.实验内容 1. 对Linux内核及用户程序进行配置: 2. 编译生成内核映像文件: 3. 把编译的映像文件烧写到FLASH中,查看运行结果 ...

  6. Oracle数据库更新时间的SQL语句

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入update t_user u set u.name='pipi',u.modifytime=to_date('2015-10 ...

  7. jdbc中java与mysql数据类型的映射

    注:这种类型匹配不是强制性标准,特定的JDBC厂商可能会改变这种类型匹配.例如Oracle中的DATE类型是包含时分秒,而java.sql.Date仅仅支持年月日.

  8. BizTalk开发系列(二十七) 异常管理中的数据编码

    在BizTalk的异常管理解决方案中.大部分是通过订阅相关的升级属性来接收消息,并在自定义的流程或发送端口进行处理.但不管怎样,一般会定义统一的 错误消息Schema,这样不仅可以让我们通过异常信息快 ...

  9. BizTalk开发系列(五) 属性字段

    在根据消息内容进行路由的时候经常使用的是可分辨字段和属性字段.属性字段可以在各个 BizTalk Server 组件(包括管道和业务流程)中进行访问.属性字段还可用于消息路由.如果需要在上下文(而不是 ...

  10. windows 7 安装 telnet

    telnet 192.168.1.10 8080