Oracle执行计划解释2

上一篇 / 下一篇  2009-01-13 23:13:29 / 个人分类:Oracle

  • 文件版本: V1.0
  • 开发商: 本站原创
  • 文件来源: 本地
  • 界面语言: 简体中文
  • 授权方式: 免费
  • 运行平台: Win9X/Win2000/WinXP

'l]"UP5n sL051Testing软件测试网/NtZ[O Qx8LC6\

jT0Ze^4Q0c0    1) 全表扫描(Full Table Scans, FTS)

"B?7Qak T QS.B051Testing软件测试网W$ebo}s \n.pWq

    为实现全表扫描,Oracle读取表中所有的行,并检查每一行是否满足语句的WHERE限制条件一个多块读 操作可以使一次I/O能读取多块数据块(db_block_multiblock_read_count参数设定),而不是只读取一个数据块,这极大的减 少了I/O总次数,提高了系统的吞吐量,所以利用多块读的方法可以十分高效地实现全表扫描,而且只有在全表扫描的情况下才能使用多块读操作。在这种访问模 式下,每个数据块只被读一次。51Testing软件测试网#_NP0[[ Z

51Testing软件测试网8_-{ A \'`

    使用FTS的前提条件:在较大的表上不建议使用全表扫描,除非取出数据的比较多,超过总量的5% —— 10%,或你想使用并行查询功能时。

D,`j+{5T Q/PyI0

$p*iy-z4FGk I0    使用全表扫描的例子:51Testing软件测试网flV;p5{N

51Testing软件测试网i,["J Zfy I#zk

51Testing软件测试网3v"~!n b5M4P_5s/NT

P5bM$h!N%s&R$@B3^m0|0    ~~~~~~~~~~~~~~~~~~~~~~~~ SQL> explain plan for select * from dual;

6`^Cd(q051Testing软件测试网n(W u4Q#e5g-}3Vq8c

    Query Plan51Testing软件测试网K'?+J7Q'pC(C

51Testing软件测试网.`I,b8Z`

    -----------------------------------------

bGi `*ZNB'DQ]0

Mrj1S_/U:E"yC kTU0    SELECT STATEMENT[CHOOSE] Cost=51Testing软件测试网 A#[;n$E|sG,Ff

51Testing软件测试网C I/p8ld#DM

    TABLE ACCESS FULL DUAL51Testing软件测试网4C.Ve{)BQ

4c.PZm P:Y0

.G{!\ _VKMa7G3wZW051Testing软件测试网~rV/P$g%o$D

    2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)

-M)y&H8QzHS)nw0

$[B8OXXl0    行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。

+|b \([J-`0

;@*J7bN r0    这种存取方法不会用到多块读操作,一次I/O只能读取一个数据块。我们会经常在执行计划中看到该存取方法,如通过索引查询数据。51Testing软件测试网9p5q,{3D y&oZ

51Testing软件测试网"{ JS3c5I[ o M

    使用ROWID存取的方法: SQL> explain plan for select * from dept where rowid = ''AAAAyGAADAAAAATAAF'';

-Ka({,xcUy0

MFJ9nD4G]9t~&j0

5^6N@2mBI-hJ051Testing软件测试网DI,m?JK [9JKvl

    Query Plan

iSf3|'zl051Testing软件测试网dr:v IN2t0T&W`#ct

    ------------------------------------51Testing软件测试网C:k&z"exw+uJ r

51Testing软件测试网&cH[+D7[ A,J

    SELECT STATEMENT [CHOOSE] Cost=151Testing软件测试网(a/X2Kp!Xu ?1x

51Testing软件测试网!J1h8Mr/A@ih

    TABLE ACCESS BY ROWID DEPT [ANALYZED]51Testing软件测试网&iz2~8US{gz-W

51Testing软件测试网2d6Cv0i2~ [E;~b0l6K l7X

51Testing软件测试网 J2j ] `5sFNUg0`6I
    3)索引扫描(Index Scan或index lookup)51Testing软件测试网| v3x P~3I?

[$J;C7Z{;Q|P0    我们先通过index查找到数据对应的rowid值(对于非唯一索引可能返回多个rowid值),然后根据rowid直接从表中得到具体的数据,这 种查找方式称为索引扫描或索引查找(index lookup)。一个rowid唯一的表示一行数据,该行对应的数据块是通过一次i/o得到的,在此情况下该次i/o只会读取一个数据库块。51Testing软件测试网+t2DNl'X"DQi7S

51Testing软件测试网aa5K2TT \k%`

    在索引中,除了存储每个索引的值外,索引还存储具有此值的行对应的ROWID值。索引扫描可以由2步组成:(1) 扫描索引得到对应的rowid值。 (2) 通过找到的rowid从表中读出具体的数据。每步都是单独的一次I/O,但是对于索引,由于经常使用,绝大多数都已经CACHE到内存中,所以第1步的 I/O经常是逻辑I/O,即数据可以从内存中得到。但是对于第2步来说,如果表比较大,则其数据不可能全在内存中,所以其I/O很有可能是物理I/O,这 是一个机械操作,相对逻辑I/O来说,是极其费时间的。所以如果多大表进行索引扫描,取出的数据如果大于总量的5% —— 10%,使用索引扫描会效率下降很多。如下列所示:SQL> explain plan for select empno, ename from emp where empno=10;

{ W E$G6jDmW U0

1Gc"imh8aZ7o(Db7h051Testing软件测试网kn"@ W(I6e ^2V

51Testing软件测试网$KnwmJ%O

    Query Plan

+l'X)F4fGA6M!L Z051Testing软件测试网 FKwd bU"s

    ------------------------------------51Testing软件测试网mS^1b(Wy]

51Testing软件测试网~'ky2a6]

    SELECT STATEMENT [CHOOSE] Cost=151Testing软件测试网$q3xA0P Xqf^

51Testing软件测试网1S N'Qb`Z

    TABLE ACCESS BY ROWID EMP [ANALYZED]51Testing软件测试网B9Uu.aN5P f

51Testing软件测试网q7@NQr NB

    INDEX UNIQUE SCAN EMP_I1

1^P&Q f(akYQ3?4a0

Mo.E} kH4m Z0
d-p.U@m0    但是如果查询的数据能全在索引中找到,就可以避免进行第2步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的

i l c%n|*K051Testing软件测试网"jDc6E$\|.og(f@

    SQL> explain plan for select empno from emp where empno=10;-- 只查询empno列值

&f:K+W|3I@g(F0

5z EL0D'R]%Y2u0    Query Plan51Testing软件测试网-p mOD-Z"p9x)hSa

8DD)VQ2x*f/| BW0    ------------------------------------

l6@z"f {6|9y8h:M} r051Testing软件测试网E)_6CKT*gDs"cZR

    SELECT STATEMENT [CHOOSE] Cost=151Testing软件测试网 @5s|U!Mh.r!p

51Testing软件测试网D(f T!}x%tb

    INDEX UNIQUE SCAN EMP_I1

,_G5PG9w0Pf/MY051Testing软件测试网4UgG#P%epZ%_:C

51Testing软件测试网VCNk `WZ

51Testing软件测试网gabmo?Q

    进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序
'J)R Dq+|E/O s3Cm0    SQL> explain plan for select empno, ename from emp

2O&o qCCYa$q0

-_TQ3W7|Q6U;^7t0    where empno > 7876 order by empno;

a"p-y~2]2}a,bS+OW051Testing软件测试网 D?VKgi6g o%wP

    Query Plan

,| ^@w%c~hoN+e)~051Testing软件测试网C+V Yn,Yf

    --------------------------------------------------------------------------------51Testing软件测试网/wc`/P&Q Y~U}q

a P)k _(D0    SELECT STATEMENT[CHOOSE] Cost=1

"L*` r~hg W~ u051Testing软件测试网0Ow"~8]9K_/D

    TABLE ACCESS BY ROWID EMP [ANALYZED]

$VK*H WJ9Z051Testing软件测试网 N2P:A-e Jj

    INDEX RANGE SCAN EMP_I1 [ANALYZED]

%u4Q!`!cvi^!K051Testing软件测试网qv.]9g A&r*qiv


&el:a2pGG t{-F0    从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。51Testing软件测试网VEU!XS$r

TAG: Oracle

 

评分:0

我来说两句

Open Toolbar