`
liulanghan110
  • 浏览: 1072451 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

反向键索引的原理和用途

阅读更多

我们知道Oracle会自动为表的主键列建立索引,这个默认的索引是普通的B-Tree索引。对于主键值是按

 

顺序(递增或递减)加入的情况,默认的B-Tree索引并不理想。这是因为如果索引列的值具有严格顺序

 

时,随着数据行的插入,索引树的层级增长很快。搜索索引发生的I/O读写次数和索引树的层级数成正

 

比,也就是说,一棵具有5个层级的B -Tree索引,在最终读取到索引数据时最多可能发生多达5次I/O操

 

作。因而,减少索引的层级数是索引性能调整的一个重要方法。

 

  如果索引列的数据以严格的有序的方式插入,那么B-Tree索引树将变成一棵不对称的"歪树",如图

 

1所示:

 

 

       而如果索引列的数据以随机值的方式插入,我们将得到一棵趋向对称的索引树,如图 2所示:

 

 

 

 

比较图 1和图 2,在图 1中搜索到A块需要进行5次I/O操作,而图2仅需要3次I/O操作。

 

  既然索引列数据从序列中获取,其有序性无法规避,但在建立索引时,Oracle允许对索引列的值进

 

行反向,即预先对列值进行比特位的反向,如 1000,10001,10011,10111,1100经过反向后的值将是

 

0001,1001,1101,0011。显然经过位反向处理的有序数据变得比较随机了,这样所得到的索引树就比较

 

对称,从而提高表的查询性能。

 

初看上面的解释,觉得写的很对,可是却忘记了索引的结构是一个平衡的树,即根节点到每一个叶子节点的距离相等。所以不存在上面的有序的值使索引层级增大的问题。实际上反转索引时为了解决热块冲突的问题。比如有ID 为1,2,3,4,5,都在索引块的BLOCK A中。当用id =1 访问时,访问的是BLOCK A。当用id =2 访问时,访问的是BLOCK A。这样就会导致索引出现热块(关于热快请参考http://zhuyuehua.iteye.com/blog/1874708)。如果反转后存放,就可能1在BLOCK A,2在BLOCK B

访问的是BLOCK A。当用id =1 访问时,访问的是BLOCK A。当用id =2 访问时,访问的是BLOCK B。

这样就解决了索引的热快问题。

 

  反向键索引也有它局限性:如果在WHERE语句中,需要对索引列的值进行范围性的搜索,如

 

BETWEEN、<、>等,其反向键索引无法使用,此时,Oracle将执行全表扫描;只有对反向键索引列进

 

行 <>和 = 的比较操作时,其反向键索引才会得到使用。

 

测试 下反向索引:

 

create index IDX_OH_CODE on TEST ( code );

 

select * from TEST where code = '111';

 

select * from TEST where code < '111';

 

create index IDX_OH_CODE on TEST ( code ) reverse;

 

select * from TEST where code = '111';

 

select * from TEST where code < '111';

 

可以发现当普通索引用code < '111'是索引范围扫描时,反转索引不是。

  • 大小: 5.2 KB
  • 大小: 4.2 KB
分享到:
评论
1 楼 willxue 2017-03-24  
看了半天 前面说的是错的?。。。

相关推荐

    1N4001-1N4007技术资料中文

    目录.chm可能是包含整个系列二极管的详细索引和章节指南,方便用户查找特定信息。下载说明.htm可能提供文件下载和解压的指导,确保用户能正确获取和访问这些技术资料。 总的来说,这个资料包对于初学者和专业工程师...

    Oracle面试题

    - 索引类型:B树、 bitmap、反向索引等,以及它们在不同场景下的适用性。 - 索引优化:何时使用索引,以及如何避免索引失效。 4. **查询优化** - Explain Plan:学习如何使用Explain Plan分析查询执行计划,找出...

    Splunk-7.3.0-Admin_zh-CN.pdf

    - ** 关于KV存储**:解释了KV存储的用途和功能。 - ** 同步与恢复**:详细步骤说明如何备份和恢复KV存储,以及进行故障排除。 9. ** Splunk与代理**: - ** Splunkd与HTTP代理**:指导如何配置Splunkd使用HTTP...

    模拟电路版图的艺术

    其次,“双极晶体管”的章节深入剖析了这种基本放大元件的工作原理和版图设计策略。双极晶体管的版图设计直接影响其增益、频率响应和热稳定性,因此理解和优化这些因素至关重要。 接着,“双极晶体管的应用”章节则...

    20191118_京东内推.docx

    Nginx常用于反向代理和负载均衡,可以将请求转发到后端不同的服务器,提高系统的可用性和响应速度。 11. **Spark用途**: Spark主要用于大数据处理,提供批处理、交互式查询(Spark SQL)、实时流处理(Spark ...

    php面试题必考

    8. **命名空间**:理解其用途和用法,以及如何解决命名冲突。 9. **字符串与正则表达式**:熟悉字符串操作函数,如`strlen`, `strpos`, `substr`, `str_replace`等,以及正则表达式的匹配和替换。 10. **文件与...

    2018年面试前一定要看的知识点,最全框架大全知识点,最新编写高质量代码秘籍

    6. 数据库:SQL语言,索引原理,事务处理,数据库优化,NoSQL数据库的概念和适用场景。 7. 版本控制:Git的常用命令及工作流,了解分支管理和合并冲突的解决。 二、框架大全知识点 1. Java框架:Spring Boot、...

    ArcSDE 空间数据库系统表结构

    **用途**:定义拓扑规则,用于验证和维护空间数据的一致性和完整性。 #### GDB_SUBTYPES - **ID**:唯一标识符。 - **ClassID**:类ID。 - **SubtypeCode**:子类型代码。 - **SubtypeName**:子类型名称。 **用途...

    android编程规范

    - 对关键代码段和复杂逻辑提供清晰的注释,解释其目的和工作原理。 6. **错误处理与日志** - 使用try-catch-finally结构处理异常。 - 适当使用Log类进行日志记录,方便调试和问题排查。 7. **性能优化** - ...

    人工神经网络水果识别

    另一方面,遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传原理的全局优化方法。在神经网络训练中,遗传算法可以用于搜索最优的权重组合。它创建一组初始权重,然后通过选择、交叉和变异等操作,逐步...

    基于SpringCloud+ElasticSearch+Vue实现的分布式微服务-全品类购物商城+源代码+文档说明+sql数据库

    用户登录后可以根据关键词搜索对应的商品信息,这里的搜索对接了全文搜索引擎ElasticSearch,它的核心原理在于倒排索引和分词技术,其中商品页面访问量大,咱们的项目实现了商品页面的静态化,当管理员添加和修改...

    C++编程思想(第2版)

    - **第9章:内联函数**:讲解内联函数的用途和优化技巧。 - **第10章:名字控制**:介绍命名空间和其他名称管理机制。 - **第11章:引用和拷贝构造函数**:讨论引用类型和拷贝构造函数的使用场景。 - **第12章:...

    java web 面试集

    - 泛型:知道泛型的用途,类型擦除,通配符等。 - 接口与抽象类:比较两者差异,了解默认方法的引入及其意义。 - 反射:理解反射机制,如何动态获取和调用类、方法、字段。 3. **Java Web基础** - Servlet:...

    pytorch进行上采样的种类实例

    上采样可以分为几种不同的实现方式,每种都有其特定的用途和优势。 1. **反卷积(Convolution Transpose)**: 反卷积(也称为转置卷积)是最常见的上采样方法之一。在`nn.ConvTranspose2d`中,通过设置`kernel_...

    rfc1034中文,翻译文档

    - **状态声明**:明确了文档的用途和限制条件。 ### 小结 通过分析RFC1034中文翻译文档,我们可以了解到DNS系统的起源、设计原理及其核心组件的工作机制。这对于理解现代互联网架构中域名解析的基础至关重要。此外...

    Electrical-Machines-Laboratory_Lres电机实验台.pdf

    - **用途:** 用于测量和监控实验过程中消耗的电能量。 - **重要性:** 帮助用户了解不同操作条件下电机的能耗情况,对于提高能源利用效率具有重要意义。 6. **附属设备作为负载、仪器等** (Page 38-47) - **...

Global site tag (gtag.js) - Google Analytics