a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 142|回复: 1

[考试辅导] Oracle技术:解析Oracle数据库厉行计划

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
 Oracle数据库厉行打算的相关常识是本文我们首要要介绍的内容,我们首先介绍了厉行打算的概念,然后给出了两个厉行打算的实例进行声名,最后介绍了Oracle优化器的形式以及厉行打算对我们的用途,接下来就让我们一路来体味一下这部门内容。   什么是厉行打算* Q* v/ k% @( {5 D
  所谓厉行打算,望文生义,即便对一个发芽使命,做出一份若何去了却使命的翔实打算。举个保留中的例子,我从珠海要去英国,我能够抉择先去喷香港然后起色,也能够先去北京起色,可能去广州也能够。然而事实若何去英国划算,也即便我的开支起码,这是一件划算考究的工作。同样对于发芽而言,我们提交的SQL仅仅是描写出了我们的方针地是英国,但至于怎么去,等闲我们的SQL中是不曾给出提醒动静的,是由数据库来决计的。9 _) B" C& K. ?3 A6 n
  我们介绍易的看一个厉行打算的对比:SQL> set autotrace traceonly8 u8 U/ Y, C- ~( k5 l  M
  厉行打算一:! X1 x3 C0 D" D2 t0 w
  以下是代码片段:+ ?& s8 r& e4 m; n% r0 E
  SQL> select count(*) from t;COUNT(*)& i, j/ k. \3 d) h; i" p
----------8 H9 v+ ~5 b, A
  24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE 10  SORT (AGGREGATE)  D0 S' u5 V  E6 L  _' u8 f7 E
  21 TABLE Access (FULL) OF 'T'厉行打算二:
8 P/ {9 s- u% K" B1 p$ H) D  以下是代码片段:
  |. e5 }0 w7 v5 X3 o  SQL> select count(*) from t;COUNT(*)
' \$ `8 b( i' Q/ u) }  24815 Execution Plan 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)' b+ T0 x0 b8 r# V6 w2 R. o
  10  SORT (AGGREGATE)
) x& t2 `% H7 }( q! q4 E+ {  21 INDEX (FULL SCAN) OF 'T_INDEX' (NON-UNIQUE)(Cost=26 Card=28180)* M. Z) U8 J: K- x$ `/ ~. `
  这两个厉行打算中,第一个暗示乞降是穿越进行全表扫描来做的,把全副表中数据读入内存来逐条累加;第二个暗示依据表中索引,把全副索引读进内存来逐条累加,而无须去读表中的数据。然而这两种法子事实哪种快呢?等闲来说可能二比一快,但也不是绝对的。这是一个很轻易的例子演示厉行打算的差异。对于混杂的SQL(表毗连、嵌套子发芽等),厉行打算可能几十种甚至上百种,然而事实那种精采呢?我们事前并不懂得,数据库自己也不懂得,然而数据库会依据定然的法定可能普查动静(statistics)去抉择一个厉行打算,等闲来说抉择的是对比优的,但也有抉择失踪手的时辰,这即便此次谈论的价值地址。
7 d) J% g2 @  o4 ]8 j3 Q  Oracle优化器形式
4 W( _  k& L8 T; {4 }  Oracle优化器有两大类,基于法定的和基于价钱的,在SQLPLUS中我们能够察看init文件中界说的缺省的优化器形式。6 s4 j0 O6 E/ d* e' v
  以下是代码片段:& P3 F9 x/ a, q5 B5 Q
  SQL> show parameters optimizer_mode NAME TYPEVALUE optimizer_mode string  CHOOSE SQL>
: ~$ m! f5 C5 [& A, h. C  这是Oracle8.1.7 企业版,我们能够看出,默认安装后数据库优化器形式为CHOOSE,我们还能够设置为 RULE、FIRST_ROWS,ALL_ROWS.能够在init文件中对全副instance的所有会话设置,也能够独自对某个会话设置:
* u' p9 D+ H" U/ _! x  以下是代码片段:
) q8 v* X* G% v' _& H3 f4 h  SQL> ALTER SESSION SET optimizer_mode = RULE;会话已改动。
% T: c0 Z7 X3 l3 A  SQL> ALTER SESSION SET optimizer_mode = FIRST_ROWS;会话已改动。% S" [  ^; V5 {/ L0 f
* k: L: `# ]. r9 d9 ~
  SQL> ALTER SESSION SET optimizer_mode = ALL_ROWS;会话已改动。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:解析Oracle数据库厉行计划

</p>  基于法定的发芽,数据库依据表和索引等界说动静,按照定然的法定来发生厉行打算;基于价钱的发芽,数据库依据汇集的表和索引的数据的普查动静(穿越analyze 号召可能操作dbms_stats包来汇集)归纳来决计拨取一个数据库感应感染最优的厉行打算(切实上无须定最优)。RULE是基于法定的,CHOOSE暗示万一发芽的表存在汇集的普查动静则基于价钱来厉行(在CHOOSE形式下Oracle核准的是 FIRST_ROWS),否则基于法定来厉行。在基于价钱的两种法子中,FIRST_ROWS指厉行打算核准起码资本尽快的归来局部收成给客户端,对于排序分页页揭示这种发芽尤其适用,ALL_ROWS指以大局破耗资本起码的法子归来收成给客户端。9 d4 o  J2 s$ D" @/ g+ O. M/ e4 R' d
  基于法定的形式下,数据库的厉行打算等闲对比平宁太平。但在基于价钱的形式下,我们才有更大的机缘抉择最优的厉行打算。也因为Oracle的良多发芽方面的个性定然在基于价钱的形式下能力揭示出来,因而我们等闲不抉择RULE(而且Oracle号称从 Oracle 10i版本数据库起头将不再扶持 RULE)。既然是基于价钱的形式,也即便说厉行打算的抉择是依据表、索引等界说和数据的普查动静来决计的,这个普查动静是依据 analyze 号召可能dbms_stats包来按期汇集的。率先存在着一种可能,即便因为汇集动静是一个很破耗资本和功夫的动作,尤其当表数据量很大的时辰,因为汇集动静是对全副表数据进行从头的周全普查,因而这是我们定然肃静严重琢磨的问题。我们只能在处事器安闲的时辰按期的行为作静汇集。这诠释我们在一段日期内,普查动静可能和数据库自己的数据并不合乎;此外即便Oracle的普查数据自己也存在着禁绝确局部(翔实参看Oracle DOCUMENT),更主要的一个问题即便实时普查数据相对曾经对比切确,然而Oracle的优化器的抉择也并不是始终是最优的打算。这也高攀于Oracle对分歧厉行打算的价钱的计较法定(我们等闲是无法懂得翔实的计较法定的)。这仿佛我们决计从喷香港仍是大北京去英国,车票、机票等切实价钱事实是怎么核算出来的我们并不懂得,可能说我们今朝探询的价钱动静,在我们搭车前往的时辰,恳挚价钱跟我们的核算曾经发生了改变。所有的身分,都将波及我们的全副开支。' {1 o" [7 q1 [- \$ `
  厉行打思俪濑功能带给我们什么1 n0 V% d: [" Z& u
  Oracle存在着厉行打算抉择失踪手的可能。这也是我们经常碰见的一些假象,例如总有人说我的过程在考试数据库中跑的很好,但在产物数据库上即便跑的很差,甚至后者硬件前提比前者还好,这事实是为什么?硬件资本、普查动静、参数设置都可能对厉行打算发生波及。因为身分太多,我们老是对未来怀着一种莫名的生怕,我的产物数据库上线后事实跑的好欠好?于是Oracle供给了一种平宁太平厉行打算的实力,也即便把在考试情形中的运行精采的厉行打算所发生的OUTLINES移植到产物数据库,使得厉行打算不会跟着其他身分的改变而改变。
+ a% V2 X0 e( b; t) t  _  那么OUTLINES是什么呢?先要举荐一个内容,Oracle供给了在SQL中操作HINTS来率领优化器发生我们想要的厉行打算的实力。这在多表毗连、混杂发芽中尤其管用。HINTS的种类良多,能够设置优化器方针(RULE、CHOOSE、FIRST_ROWS、ALL_ROWS),能够指定表毗连的顺序,能够指定操作哪个表的哪个索引等等,能够对SQL进行良多邃密的扼制。穿越这种法子发生我们想要的厉行打算的这些HINTS,Oracle能够存储这些HINTS,我们称之为OUTLINES.穿越STORE OUTLINES能够使得我们具有尔后发生类似厉行打算的实力,也即便使我们具有了平宁太平厉行打算的实力。$ s1 p5 [. j  [$ E2 p1 m! ~+ H
  这里想给出一个附带的诠释即便,切实上,我们穿越工具改削SQL,例如操作SQL EXPERT改削后的SQL,这些不单仅是加了HINTS而且文本都曾经发生了改变的SQL,也能够存储OUTLINES,并可被操作到操作中。但这不是定然生效,我们定然考试察看是否生效。但因为就算给了杜缦泯的OUTLINES,数据库在厉行的时辰,揖智疏忽曩昔从头生成厉行打算而不会归来杜缦泯,因而我们才敢塌心的这么操作。当然在Oracle文档中并不曾指明能够这么做,文档中只是诠释,万一存在OUTLINES的同时又在SQL中加了HINTS,则会操作OUTLINES而疏忽HINTS.这秉功能在LECCO将发布的产物中会操作这一功能,这么能够将SQL EXPERT的改削SQL的实力和平宁太平厉行打算的实力连系起来,那么我们就对不能改动源代码的操作具有了相当壮大的SQL优化实力。
. ]/ d4 W4 K+ D: U$ E! Q  可能我们会有疑问,假定平宁太平了厉行打算,那还汇集普查动静干吗?这是因为几个原由组成的,率先,今朝的厉行打算对于未来发生了改变的数据未必即便精练的,存在着今朝的厉行打算不中意未来数据的改变后的效率,而新的普查动静的气象下所发生的厉行打算也并不是全副都科学的。那这个时辰,我们能够核准新汇集的普查动静,然而却对新普查动静下不良的厉行打算核准Oracle供给的厉行打思俪濑性这个实力平宁太平厉行打算,这么连系起来我们能够发生顺心的高效的数据库运行情形。; F5 m9 l$ Y' ?7 Q( m
  我们还必需关切的一个工具,Oracle供给的dbms_stats包除非具有汇集普查动静的实力,还具有把数据库中普查动静(statistics)export/import的实力,还具有只汇集普查动静而使得普查动静不操作于数据库的实力(把普查动静汇集到一个特定的表中而不是即刻生效),在这个基本上我们就能够把普查动静export出来再import到一个考试情形中,再运行我们的操作,在考试情形中我们考绩最新的普查动静会导致哪些厉行打算发生改变(DB EXPERT的Plan Version Tracer是模拟分歧情形并积极察看分歧情形中厉行打算改变的工具),是变好了仍是变差了。我们能够把变差的这一局部在考试情形中操作hints可能操作工具(SQL EXPERT是在重写SQL这一河山此刻最强有力的工具)发生精采的厉行打算的SQL,操作这些SQL能够发生OUTLINES,然后在产物数据库操作最新的普查动静的同时移植进这些OUTLINES.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 17:43 , Processed in 0.183055 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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