网站大量收购独家精品文档,联系QQ:2885784924

oracle-基本索引原理.pdf

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
oracle-基本索引原理

基本索引概念 当从表中读取数据时,Oracle提供了两个选择: 从表中读取每一行(全表扫描 通过ROWID一次读取一行 当我们要访问大型表的少数行时,可能需要使用索引。 因为如果没有索引,那么只能进行全表扫描。 索引改进性能的程度取决于两个因素: 1、数据的选择性 2、表数据在数据块上的分布 如果选择性很高(例如身份证号码),那么根据索引值返回的ROWID很少, 如果选择性很低(例如国家)则返回的ROWID很多,那么索引的性能将会 大大降低 如果选择性很高,但是相关的行在表中的存储位置并不互相靠近,则会进 一步减少索引的益处,如果匹配索引值的数据分散在表的多个数据块中, 则必须从表中选择多个单独的块以满足查询,基于索引的读取是单块读取, 如果使用全表扫描,使用的是多块读取以快速扫描表,因此全表扫描不见 得比索引扫描速度慢。 全表扫描和索引查找之间的平衡点 1、分区 2、并行DML 3、并行查询 4 、使用db_file_multiblock_read_count进行更大的IO操作 5、硬件更为快速 6、磁盘上的缓存可以缓存更多的数据 7、内存的廉价使得我们的内存进一步增大 8、Oracle采用了增强的索引特性(例如跳跃式扫描索引 SELECT、UPDATE、DELETE+WHERE条件可以从索引中得到好处 (前提是:当访问的行数较少时 一般来说,增加索引会带来insert语句性能的下降 如果根据未索引列update索引列,那么也会带来性能的降低 大量的delete也会因为索引的存在而导致性能降低 因此我们要分析具体的情况,判断索引和DML语句之间的关系 我们如何去去判断一个表上的索引呢? 如果发现对一个表的DML速度较慢,可以执行上面的命令,判断是 否是因为增加了索引而引起的性能问题。 组合索引 当某个索引包含有多个列时,我们称这个索引为组合索引。 在使用组合索引的时候,要谨慎选择索引列中的列顺序。 一般来说,索引的第一列应该是最有可能在where子句中使用的列,并且也是在 索引中最具有选择性的列。 对于9i 以前,查询只能在where子句中使用索引的第一列时使用索引。 除非在where子句中给empno指定一个值,否则一般不会使用组合索引。 从Oracle 9i开始,引入了跳跃式索引扫描功能,即使在where子句中没有指 定empno 的数值,也会可能会使用索引。 我们来举个例子,看一下跳跃式索引扫描。 create index sex_emp_id on emp(sex,emp_id) select * from emp where emp_id=123; 在Oracle数据库的内部,生成了两个查询,然后对两个查询的ROWID进行了联合。 当使用跳跃式索引扫描时,自动给SEX加上了数值,启用了两个查询。如果SEX有 50个数值,那么需要启用50个查询才能完成查询,因此性能大大降低。因此是否 适合使用跳跃式索引扫描,取决于第一个索引列的选择性。一般建议第一个列的 可选性非常低。 跳跃式索引扫描相对索引直接扫描速度要慢一些,但是相对表扫描速度还是要快 很多。 使用跳跃式索引的条件   1 优化器认为是合适的.   2 索引中的前导列的唯一值的数量能满足一定的条件.   3 优化器要知道前导列的值分布(通过分析/统计表得到)   4 合适的SQL语句 如果oracle没有选择使用跳跃式索引扫描,那么可能选择使用索引快速全局 扫描或全表扫描。 我们花点时间来研究一下Oracle 中扫描数据的方法: 1、全表扫描(Full Table Scan FT Oracle读取表中所有的行、多块读操作可以大大的减少IO的次数、利用多块 读可以大大的提高全表扫描的速度、只有在全表扫描的情况下才能使用多 块读。 在较大的表上不建议使用全表扫描、如果读取表的数据总量超过5%—10%, 那么通常进行全表扫描。 并行查询可能会使得我们的路径选择采用全表扫描。 2、通过ROWID对表进行读取(Table access by ROWID ROWID指出了数据文件、块号、行号,通过ROWID是oracle数据库中读 取单行数据最快速的方法。 这种方法不会采用多块读、而是会采用单块读的方式。 3、索引扫描或者索引查找(index scan index lookup 通过索引找到

文档评论(0)

xxj1658888 + 关注
实名认证
内容提供者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档