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;会话已改动。 |