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

几种索引扫描方式.doc

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

几种索引扫描方式 1)索引唯一扫描 如果查询时是通过unique或primary key约束来保证只返回一条数据,那么优化器就会选择索引唯一扫描,这是访问一条数据的最快方式。 2)索引范围扫描 索引键非唯一,当遇到如下条件时会使用索引范围扫描: 1.col=:b1 2.col:b1 3.col:b1 3)索引降序范围扫描 与2)中的情况相同,只不过2)默认是安装 升序进行查找的,而这里是按降序进行查找,如: select line_item_id,order_id from order_items where order_id:b1 order by order_id desc; 4) 跳跃式索引(Skip Scan Index)。当表有一个复合索引,而在查询中有除了索引中第一列的其他列作为条件,并且优化器模式为CBO,这时候查询计划就有可能使用到SS,另外通 过使用提示index_ss(CBO下)来强制使用SS。跳跃式索引使复合索引从逻辑上分为几个小的子索引,分的条件就是复合索引列的第一个字段,可以这 样理解,Oracle 将索引从逻辑上划分为a.num_distinct个子索引,每次对一个子索引进行扫描。因此SS的索引扫描成本为a.num_distinct.而且使用SS的条件需要第一列的distinct num要足够小 5)index full scan和Index Fast Full Scan(全索引扫描和快速全索引扫描) index full scan和index fast full scan是指同样的东西吗?答案是no。两者虽然从字面上看起来差不多,但是实现的机制完全不同。我们一起来看看两者的区别在哪里? 首先来看一下IFS,FFS能用在哪里:在一句sql 中,如果我们想搜索的列都包含在索引里面的话,那么index full scan 和 index fast full scan 都可以被采用代替full table scan。比如以下语句:      SQL CREATE TABLE TEST AS SELECT * FROM dba_objects WHERE 0=1;      SQL CREATE INDEX ind_test_id ON TEST(object_id);      SQL INSERT INTO TEST   SELECT  *   FROM dba_objects   WHERE object_id IS NOT NULL AND object_id 10000   ORDER BY object_id DESC;      17837 rows created.      SQL analyze table test compute statistics for table for all columns for all indexes;      Table analyzed.   SQL set autotrace trace;      SQL select object_id from test;      17837 rows selected.      Execution Plan   ----------------------------------------------------------     0   SELECT STATEMENT ptimizer=CHOOSE (Cost=68 Card=17837 Bytes=71348)     1  0  TABLE ACCESS (FULL) OF TEST (Cost=68 Card=17837 Bytes=71348)      这时候Oracle 会选择全表扫描,因为 object_id 列默认是可以为null的,来修改成 not null:         SQLalter table test modify(object_id not null);      SQL select object_id from test;      17837 rows selected.      Execution Plan   ----------------------------------------------------------     0   SELECT STATEMENT ptimizer=CHOOSE (Cost=11 Card=17837 Bytes=71348)     1  0  INDEX (FAST FULL SCAN) OF IND_TEST_ID (NON-UNIQUE) (Cost=11 Card=17837 Bytes=71348)      当然我们也可以使用index

文档评论(0)

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

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

1亿VIP精品文档

相关文档