- 1、本文档共71页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)