Oracle索引梳理系列(三)- Oracle索引种类之反向索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载。转载时,请在文章明显位置注明原文链接。若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利。如果有问题,请以邮箱方式联系作者(793113046@qq.com)。
一 反向索引
1.1 反向索引的定义
- 反向索引作为B-tree索引的一个分支,主要是在创建索引时,针对索引列的索引键值进行字节反转,进而实现分散存放到不同叶子节点块的目的。
 
1.2 反向索引针对的问题
- 使用传统的B-tree索引,当索引的列是按顺序产生时,相应的索引键值会基本分布在同一个叶块中。当用户对该列进行操作时,难免会发生索引块的争用。
 - 使用反向索引,将索引列的键值进行反转,实现顺序的键值分散到不同的叶块中,从而减少索引块的争用。
 - 例如:键值1001、1002、1003,反转后1001、2001、3001,进而分散到不用的叶子节点块中。
 
1.3 反向索引应用场景
- 索引块成为热点块
 - rac环境
- rac环境下中多节点访问访问数据呈现密集且集中的特点,索引热块的产生较高。
 - 在范围检索不高的rac环境中使用反向索引可有效提高性能。
 
 
1.4 反向索引的优点与缺点
- 优点:降低索引叶子块的争用问题,提升系统性能。
 - 缺点:对于范围检索,例如:between,>,<时,反向索引无法引用,进而导致全表扫面的产生,降低系统性能。
 
1.5 反向索引示例说明
-- 创建两张相同结构的表,内部结构及数据均引用scott用户下的emp表
SQL> select count(*) from test01; COUNT(*)
----------
14
SQL> select count(*) from test02; COUNT(*)
----------
14 --针对表TEST01的empno列,添加B-tree索引
SQL> create index PK_TEST01 on TEST01(EMPNO);
Index created. --针对表TEST02的empno列,添加反向索引
SQL> create index PK_REV_TEST02 on TEST02(EMPNO) REVERSE;
Index created. --验证上面的索引,NORMAL/REV表明为反向索引
SQL> select TABLE_NAME,INDEX_NAME,INDEX_TYPE from user_indexes where INDEX_NAME like '%TEST%'; TABLE_NAME INDEX_NAME INDEX_TYPE
-------------------- -------------------- --------------------
TEST01 PK_TEST01 NORMAL
TEST02 PK_REV_TEST02 NORMAL/REV --打开会话追踪
SQL> set autotrace traceonly --相同条件查询,观察两表的执行计划
SQL> select * from TEST01 where empno=7369;
Execution Plan
----------------------------------------------------------
Plan hash value: 515586510 -----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 87 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST01 | 1 | 87 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | PK_TEST01 | 1 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("EMPNO"=7369) Note
-----
- dynamic sampling used for this statement (level=2) Statistics
----------------------------------------------------------
152 recursive calls
0 db block gets
23 consistent gets
0 physical reads
0 redo size
1025 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed SQL> select * from TEST02 where empno=7369; Execution Plan
----------------------------------------------------------
Plan hash value: 1053012716 ---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 87 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST02 | 1 | 87 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | PK_REV_TEST02 | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("EMPNO"=7369) Note
-----
- dynamic sampling used for this statement (level=2) Statistics
----------------------------------------------------------
148 recursive calls
0 db block gets
21 consistent gets
0 physical reads
0 redo size
1025 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed -- 相同范围条件查询,观察两表的执行计划
SQL> select * from TEST01 where empno between 7350 and 7500; Execution Plan
----------------------------------------------------------
Plan hash value: 515586510 -----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 174 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST01 | 2 | 174 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | PK_TEST01 | 2 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("EMPNO">=7350 AND "EMPNO"<=7500) Note
-----
- dynamic sampling used for this statement (level=2) Statistics
----------------------------------------------------------
9 recursive calls
0 db block gets
10 consistent gets
0 physical reads
0 redo size
1120 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed SQL> select * from TEST02 where empno between 7350 and 7500; Execution Plan
----------------------------------------------------------
Plan hash value: 3294238222 ----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 174 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TEST02 | 2 | 174 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("EMPNO">=7350 AND "EMPNO"<=7500) Note
-----
- dynamic sampling used for this statement (level=2) Statistics
----------------------------------------------------------
5 recursive calls
0 db block gets
8 consistent gets0 redo size
1112 bytes sent via SQL*Net to client
523 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2 rows processed通过上面的示例可以看到,当使用between条件进行范围查询时,采用反向索引的表,并没有使用索引,而是采用了全表扫面的方式进行检索。
Oracle索引梳理系列(三)- Oracle索引种类之反向索引的更多相关文章
- [独孤九剑]Oracle知识点梳理(三)导入、导出
		
本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...
 - Oracle知识梳理(三)操作篇:SQL基础操作汇总
		
Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式: CREATE TABLE table_name ( col_ ...
 - Oracle索引梳理系列(二)- Oracle索引种类及B树索引
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(五)- Oracle索引种类之表簇索引(cluster index)
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(四)- Oracle索引种类之位图索引
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 - Oracle索引梳理系列(一)- Oracle访问数据的方法
		
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
 
随机推荐
- Adb connection Error:远程主机强迫关闭了一个现有的连接
			
在用手机调试程序时,有时会出现“Adb connection Error:远程主机强迫关闭了一个现有的连接”的错误. 出现这种错误时,可以按照以下步骤解决: (1)运行cmd.exe,并将目录CD到\ ...
 - Get a List of Keys From a Dictionary in Both Python 2 and Python 3
			
http://askubuntu.com/questions/656610/trying-to-install-mysql-connector-for-python-3?rq=1 trying to ...
 - 第 24 章 CSS3 变形效果[下]
			
学习要点: 1.3D 变形简介 2.transform-style 3.perspective 4.3D 变形属性 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 的变形效果,主要接着上节课 ...
 - [moka同学笔记]YII2.0 判断签约状态,sql的两种查询方法
			
方法一: //判断签约状态 $signed = 0; $sql="SELECT * from usho_community_sign_record WHERE com_id=$r->i ...
 - Verilog学习笔记设计和验证篇(四)...............状态机的置位与复位
			
1)状态机的异步置位和复位 异步置位与复位是于时钟无关的.当异步置位或复位信号来临时,他们立即分别置触发器的输出为1或0,不需要等待时钟沿的到来.要将他们列入always块的事件控制信号内就能触发al ...
 - android 去掉标题
			
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FUL ...
 - asp.net  mvc4 使用  System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bundling and Minification )
			
Bundling and Minification两个单词对今天的内容有个比较好的总结. 问题所在 一. 在asp.net包括mvc项目中,引入js和css也许有人认为是个很容易和很简单操作的事情,v ...
 - 对datatable操作,查询
			
#region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回 /// <summary> /// DataTable筛选,排 ...
 - CSS中!important的作用
			
提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: 示例代码: div { color: #f00 !import ...
 - 【CSS3】CSS3:border-image的详解和实例
			
border-image简介 border-image是CSS3中的新特性.目前几乎所有的主流浏览器都已经支持该特性,详情请移步border-image的兼容性. border-image属性及使用说 ...