a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 76|回复: 0

[综合辅导] Linux认证:全表扫描和索引扫描的区别

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
1) 全表扫描(Full Table Scans, FTS)   为实现全表扫描,篡夺表中所有的行,并搜检每一行是否知足语句的WHERE限制前提。挨次地篡夺分配给表的每个数据块,直到读到表的最高水线处(high water mark, HWM,标识表的最后一个数据块)。一个多块读操作可以使一次I/O能篡夺多块数据块(db_block_multiblock_read_count参数设定),而不是只篡夺一个数据块,这极大的削减了I/O总次数,提高了系统的吞吐量,所以操作多块读的体例可以十分高效地实现全表扫描,而且只有在全表扫描的情形下才能使用多块读操作。在这种访谒模式下,每个数据块只被读一次。因为HWM标识最后一块被读入的数据,而delete操作不影响HWM值,所以一个表的所稀有据被delete后,其全表扫描的时刻不会有改善,一般我们需要使用truncate呼吁来使HWM值归为0.幸运的是oracle 10G后,可以人工缩短HWM的值。
* X" q/ E6 w# L/ ~1 b  由FTS模式读入的数据被放到高速缓存的Least Recently Used (LRU)列表的尾部,这样可以使其快速交流出内存,从而不使内存主要的数据被交流出内存。3 V4 }$ y5 ?& m6 ~0 Y
  使用FTS的前提前提:在较大的表上不建议使用全表扫描,除非掏出数据的斗劲多,跨越总量的5% —— 10%,或你想使用并行发芽功能时。
( u& t3 D/ K3 L  使用全表扫描的例子:~~~~~~~~~~~~~~~~~~~~~~~~ SQL> explain plan for select * from dual;Query Plan, P: I* S% M+ `' a
-----------------------------------------+ |- V; Q. o  }
  SELECT STATEMENT Cost= TABLE ACCESS FULL DUAL 2) 经由过程ROWID的表存取(Table Access by ROWID或rowid lookup)
% X6 D- D9 D+ p9 B9 ^: G  行的ROWID指出了该行地址的数据文件、数据块以及行在该块中的位置,所以经由过程ROWID来存取数据可以快速定位到方针数据上,是Oracle存取单行数据的最快体例。! c" j/ c, `6 H+ X& Z
  为了经由过程ROWID存取表,Oracle 首先要获取被选择行的ROWID,或者从语句的WHERE子句中获得,或者经由过程表的一个或多个索引的索引扫描获得。Oracle然后以获得的ROWID为依据定位每个被选择的行。
# C4 S$ V# S/ W- Q  这种存取体例不会用到多块读操作,一次I/O只能篡夺一个数据块。我们会经常在执行打算中看到该存取体例,如经由过程索激发芽数据。7 S' g# s" y! @' l
  使用ROWID存取的体例:SQL> explain plan for select * from dept where rowid = 'AAAAyGAADAAAAATAAF';Query Plan
2 |3 y* l* [5 J- l7 z' [5 n0 W  `) F------------------------------------
" ]* b& s- i6 J$ b- r. O3 k* `  SELECT STATEMENT Cost=1 TABLE ACCESS BY ROWID DEPT 3)索引扫描(Index Scan或index lookup)2 y0 y+ Z4 x1 {& H8 `
  我们先经由过程index查找到数据对应的rowid值(对于非独一索引可能返回多个rowid值),然后按照rowid直接从表中获得具体的数据,这种查找体例称为索引扫描或索引查找(index lookup)。一个rowid独一的暗示一行数据,该行对应的数据块是经由过程一次i/o获得的,在此情形下该次i/o只会篡夺一个数据库块。 23在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1) 扫描索引获得对应的rowid值。 (2) 经由过程找到的rowid从表中读出具体的数据。每步都是零丁的一次I/O,可是对于索引,因为经常使用,绝大大都都已经CACHE到内存中,所以第1步的I/O经常是逻辑I/O,即数据可以从内存中获得。可是对于第2步来说,如不美观表斗劲大,则其数据不成能全在内存中,所以其I/O很有可能是物理I/O,这是一个机械操作,相对逻辑I/O来说,是极其费时刻的。所以如不美观多大表进行索引扫描,掏出的数据如不美观大于总量的5% —— 10%,使用索引扫描会效率下降良多。0 o: Z5 `& U( d' V( c# Q
  如下列所示:SQL> explain plan for select empno, ename from emp where empno=10;Query Plan
0 R3 q2 Y/ A8 h/ Z5 m9 ?------------------------------------
9 u5 t( P2 s: C) b8 A: C  SELECT STATEMENT Cost=1 TABLE ACCESS BY ROWID EMP INDEX UNIQUE SCAN EMP_I1注重TABLE ACCESS BY ROWID EMP部门,这剖明这不是经由过程FTS存取路径访谒数据,而是经由过程rowid lookup存取路径访谒数据的。在此例中,所需要的rowid是因为在索引查找empno列的值获得的,这种体例是INDEX UNIQUE SCAN查找,后面给以介绍,EMP_I1为使用的进行索引查找的索引名字。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-21 07:49 , Processed in 0.250993 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表