• 一 反向索引

    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(*)
    ---------- SQL> select count(*) from test02; COUNT(*)
    ---------- --针对表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):
    ---------------------------------------------------
    - access("EMPNO"=7369) Note
    -----
    - dynamic sampling used for this statement (level=2) Statistics
    ----------------------------------------------------------
    recursive calls
    db block gets
    consistent gets
    physical reads
    redo size
    bytes sent via SQL*Net to client
    bytes received via SQL*Net from client
    SQL*Net roundtrips to/from client
    sorts (memory)
    sorts (disk)
    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):
    ---------------------------------------------------
    - access("EMPNO"=7369) Note
    -----
    - dynamic sampling used for this statement (level=2) Statistics
    ----------------------------------------------------------
    recursive calls
    db block gets
    consistent gets
    physical reads
    redo size
    bytes sent via SQL*Net to client
    bytes received via SQL*Net from client
    SQL*Net roundtrips to/from client
    sorts (memory)
    sorts (disk)
    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):
    ---------------------------------------------------
    - access("EMPNO">=7350 AND "EMPNO"<=7500) Note
    -----
    - dynamic sampling used for this statement (level=2) Statistics
    ----------------------------------------------------------
    recursive calls
    db block gets
    consistent gets
    physical reads
    redo size
    bytes sent via SQL*Net to client
    bytes received via SQL*Net from client
    SQL*Net roundtrips to/from client
    sorts (memory)
    sorts (disk)
    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):
    ---------------------------------------------------
    - filter("EMPNO">=7350 AND "EMPNO"<=7500) Note
    -----
    - dynamic sampling used for this statement (level=2) Statistics
    ----------------------------------------------------------
    recursive calls
    db block gets
    consistent gets0 redo size
    bytes sent via SQL*Net to client
    bytes received via SQL*Net from client
    SQL*Net roundtrips to/from client
    sorts (memory)
    sorts (disk)
    rows processed

    通过上面的示例可以看到,当使用between条件进行范围查询时,采用反向索引的表,并没有使用索引,而是采用了全表扫面的方式进行检索。

Oracle 反向索引(反转建索引) 理解的更多相关文章

  1. Oracle外键需要建索引吗?

    关于Oracle中的外键,首先要说明一下. 1. 除非已定义了父表主键或唯一键约束,否则oracle将不允许创建子表的外键约束. 2. 在定义外键约束时,oracle不会自动创建索引,所以必须手动在与 ...

  2. Oracle 学习总结 - 表和索引的性能优化

    表的性能 表的性能取决于创建表之前所应用的数据库特性,数据库->表空间->表,创建数据库时确保为每个用户创建一个默认的永久表空间和临时表空间并使用本地管理,创建表空间设为本地管理并且自动段 ...

  3. MySQL索引(二):建索引的原则

    在了解了索引的基础知识及B+树索引的原理后(如需复习请点这里),这一节我们了解一下有哪些建索引的原则,来指导我们去建索引. 建索引的原则 1. 联合索引 我们可能听一些数据库方面的专业人士说过:&qu ...

  4. SQL SERVER大话存储结构(4)_复合索引与包含索引

              索引这块从存储结构来分,有2大类,聚集索引和非聚集索引,而非聚集索引在堆表或者在聚集索引表都会对其 键值有所影响,这块可以详细查看本系列第二篇文章:SQL SERVER大话存储结构 ...

  5. oracle建索引的可选项

    oracle中建索引可能大家都会,但是建索引是有几个选项参数却很少有人关注,在某些特殊环境下,可能会非常有用,下面一一说明: 1.NOSORT,记录排序可选项. 默认情况下,在表中创建索引的时候,会对 ...

  6. Oracle使用并行建索引须要注意的问题

    建索引时.我们为了建索引快.会加上并行,加上并行之后.此列索引就会是并行了. 訪问有并行度的索引时,CBO可能可能会考虑并行运行.这可能会引发一些问题,如在server资源紧张的时候用并行会引起更加严 ...

  7. [慢查优化]建索引时注意字段选择性 & 范围查询注意组合索引的字段顺序

    文章转自:http://www.cnblogs.com/zhengyun_ustc/p/slowquery2.html 写在前面的话: 之前曾说过"不要求每个人一定理解 联表查询(join/ ...

  8. Sql Server之旅——第七站 为什么都说状态少的字段不能建索引

    我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说 ...

  9. oracle唯一索引与普通索引的区别和联系以及using index用法

    oracle唯一索引与普通索引的区别和联系 区别:唯一索引unique index和一般索引normal index最大的差异是在索引列上增加一层唯一约束.添加唯一索引的数据列可以为空,但是只要尊在数 ...

随机推荐

  1. small zhishi

    \\192.168.1.201\d$\Data 访问远程计算机文件资源管理器

  2. Jquery实现自动生成二级目录

    在博客园开通博客以后,就看到某位博友写的js自动生成目录的文章,当时觉得生成目录能给阅读带来方便,所以就直接拿来使用了.用了一段时间以后,发现只能生成一级目录,不能生成多级目录,有点美中不足.所以想着 ...

  3. JavaScript对象 创建对象(一)

    创建对象  --以下内容来自JavaScript高级程序设计 工厂模式 用函数来封装以特定接口创建对象的细节. function createPerson(name, age, job){ var o ...

  4. 多线程篇四:ThreadLocal实现线程范围内变量共享

    1.static实现线程范围内变量共享 package com.test.shareData; import java.util.Random; /** * 多线程范围内的数据共享 * @author ...

  5. 有关table布局时tr 属性display:block显示布局错乱

    display:block display:block是可以把非块级元素强制转换为块级元素显示,如内嵌元素span,原来不支持设置宽高,宽度是由内容撑开的; display:table-row tab ...

  6. alpinelinux

    https://wiki.alpinelinux.org/wiki/Tutorials_and_Howtos https://nixos.org/nix/manual/#ch-installing-b ...

  7. VC++上机实习

    I.课程设计基本练习题目(18分×4) [A组]请从以下1-3题中任意选做一题 1.输出1至100之间每位数的乘积大于每位数的和的数,例如对于数字12,有1*2<1+2,故不输出该数:对于27, ...

  8. 【Linux】chmod命令

    格式chmod 权限 要修改权限的文件linux中的权限如下: -rw------- (600) -- 只有属主有读写权限. -rw-r--r-- (644) -- 只有属主有读写权限:而属组用户和其 ...

  9. mybooklist.cn 书单de故事六月十六日

    1.我的30年30本书 刘苏里书单北京万圣书园总经理,以经营人文社科类图书著称.生于1960年,1983年毕业于北京大学国际政治系,1986年毕业于中国政法大学研究生院.

  10. redis缓存技术在java中的应用

    https://blog.csdn.net/zhh1072773034/article/details/78538012