DB2数据库更新执行计划的几个常见的方法
和Oracle数据库一样,DB2数据库里面也是通过优化器来分析你的SQL,生成它认为最优的执行计划(Access Plan)。DB2的优化器实际上是一个标准规则集合,一般来说我们只要告诉DB2要检索什么,而不是如何检索。 我爱电脑技术论坛 D7 G- N; D$ t
1 p7 J" N4 R, y# I$ K/ U f电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
: ] k4 u7 U" O, j; y6 p; f. B打造最好的电脑自学交流论坛
4 \; l) W0 j0 s* g) X4 vwww.520diannao.com那么DB2的优化器是根据什么来判断SQL的最优存取路径呢?
; F2 |) N3 m1 b! ~. f! J打造最好的电脑自学交流论坛
5 M. o2 Z0 N0 K L, d我爱电脑技术社区--打造最好的电脑技术自学交流平台
7 D# |7 w: l6 M我爱电脑技术论坛" j( H& o* t9 P0 v
DB2的优化器是基于成本的优化器,也就是CBO(Cost Based Optmizer)。也就是说DB2 优化器会应用查询成本公式,该公式对每条可能的存取路径的四个因素进行评估和权衡:CPU 成本、I/O 成本、DB2 系统目录中的统计信息和实际的 SQL 语句。 我爱电脑技术社区--打造最好的电脑技术自学交流平台& f3 Z/ `# o+ H# M
我爱电脑技术社区--打造最好的电脑技术自学交流平台9 Z# o7 U) B/ A
我爱电脑技术论坛& e+ e" w" b" h
2 l$ p7 E" g, \% U1 l* ^打造最好的电脑自学交流论坛那么我们来简单看一下DB2的优化器的工作流程:
0 O) v8 m8 N' U: Y) R4 q打造最好的电脑自学交流论坛
% |: t- e W# a4 P. E V0 _: w! s7 F+ c我爱电脑技术论坛
4 m9 A7 `4 D5 _. Z3 M+ p# M2 L+ W$ Uwww.520diannao.com
3 `% o: v, g) F. P2 i我爱电脑技术社区--打造最好的电脑技术自学交流平台1. DB2的优化器,在接收到SQL语句后,会首先校验SQL的语法,确保是正确的SQL;
" \' N) `# @' u8 p$ {
' U. Q3 P& S2 S# J2 g; p8 Z j' w6 Q4 O7 S0 q; _
% J L/ Y+ N) ~% N我爱电脑技术社区--打造最好的电脑技术自学交流平台2. 根据当前的系统环境信息,生成最优的执行计划来优化SQL语句; 0 X4 z# ~- P }8 i: F
) i0 \5 e2 T8 x( \2 cwww.520diannao.com
2 V9 B; `. }! ^! d) F i我爱电脑技术论坛www.520diannao.com( H1 p0 {( z6 m
3. 把SQL翻译成计算机指令语言,并执行这个优化后的SQL;
7 ]) W5 [ N" f4 v) f) V) `1 A
1 I* ]- h5 W' Z% q$ d, nwww.520diannao.com
H% U; G0 x0 N: c( ]2 v+ g
) ]" J& w$ g! o; w( p2 d打造最好的电脑自学交流论坛4. 返回结果,或者存储它们,以便将来的执行。
( @7 [$ n4 z7 v: p0 _; s电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站9 i+ ~, h9 s* a9 ^. }
9 _( V7 E. R- E: V# _7 A. _) p* j: J2 i) ]
在我们看来,DB2 系统目录中统计信息是让DB2优化器正确工作的一个非常重要的依据。这些统计信息向优化器提供了与正在被优化的 SQL 语句将要访问的表状态相关的信息。这些信息主要包括:
- F2 w9 p9 ^3 l1 ?( Y2 {www.520diannao.com
$ {+ G* g- ]7 o; K% Q/ X打造最好的电脑自学交流论坛www.520diannao.com. B. M0 O5 z q; S$ F& ]8 s
: n; w, U. y& Y0 i- r$ s$ UTable--包括表的记录数、PAGE、PCTFREE以及COMPRESS等信息,相关的系统视图是:sysstat.tables、syscat.tables。
: M0 L9 [; W. ]2 r) @1 O电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
8 _: e% ^% ~! H# m+ y K; z4 F电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛0 h7 C& T- `: k" x3 f
# t- a6 i6 k( a8 e/ C) }% u打造最好的电脑自学交流论坛Columns—包括COLUMNS的数量、长度、分布特征以及COMPRESS等信息,相关的系统视图是:sysstat.columns、syscat. columns。
: w L# q( o* `$ {7 L0 E! Z0 r我爱电脑技术社区--打造最好的电脑技术自学交流平台! m: Q# x' _- \' E; u
- c/ L+ F/ y2 J) H* `
; a4 x! G' x5 ^5 C# l电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站Index--包括是否存在索引、索引的组织(叶子页的数量和级别的数量)、索引键的离散值的数量以及是否群集索引, 相关的系统视图是:sysstat.indexes、syscat. indexes。
7 [( ^ L' Z: T0 I: B. S$ ^打造最好的电脑自学交流论坛
5 v2 ~6 |- e: a6 q8 C, {电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
4 Q% D8 W: a1 Z3 x我爱电脑技术社区--打造最好的电脑技术自学交流平台电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 s0 N8 y4 o! _/ m& @; i1 O
其他的还有分区/节点组信息和表空间的信息,如何及时更新这些信息呢?保证DB2优化器正确的工作,在DB2里面提供了以下的办法。
" Z5 n: n8 Y( v- O打造最好的电脑自学交流论坛6 b; d! o# {5 K( a, z& k
我爱电脑技术论坛" ^: @5 q% F: T7 `" c* |# \/ t8 ^' P
9 Z! ]% T- U) w( E# f6 P- T我爱电脑技术论坛RUNSTATS与REOGCHK
! ]- L( w3 p( C0 |我爱电脑技术社区--打造最好的电脑技术自学交流平台
9 F4 e' d: Z8 Q' m我爱电脑技术社区--打造最好的电脑技术自学交流平台
: s" L0 t- I% x我爱电脑技术论坛
0 ]. a! }" E2 w6 n1 l5 ywww.520diannao.comRunstats这个命令的功能主要就是收集数据库对象的状态信息,这对数据库使用合理的ACCESS PLAN是至关重要的。一般来说,以下几种情况下面,我们需要用runstats来收集统计信息: 打造最好的电脑自学交流论坛$ t) [4 r- i" y$ k5 O/ G
0 U$ x# P4 I& T' v/ M我爱电脑技术社区--打造最好的电脑技术自学交流平台! v: \2 s0 b, h- E
8 y% n( q, w n; Y3 ^* f我爱电脑技术社区--打造最好的电脑技术自学交流平台1. 在给表创建一个index后,我们最好做一次runstat。这个情况也是大家经常忽略的。很多时候大家在给表增加了一个index后,分析执行计划,发现没有变化,觉得很奇怪。其实这个时候,你需要做一次runstats,就可以了。在8.2里面,DB2做了很好的改进,可以避免这个问题,在创建index的时候,可以立即更新你的信息。 www.520diannao.com3 o4 D% e( N( N
, y& T, \0 j3 ?7 J: R p
打造最好的电脑自学交流论坛/ W1 R( y* o1 W/ w2 @
我爱电脑技术社区--打造最好的电脑技术自学交流平台: E8 V- j( z+ D
2. 在对table做了一次reorg后,记得要做一次runstats。因为对表做reorg,会修改表的很多信息,比如高水位等,所以做一次runstats,可以更新统计信息。
( @9 D3 N' L& Z% w我爱电脑技术论坛. x/ b* H5 ]& t3 h m( n7 W7 c
[! p9 ~! C* Y: H打造最好的电脑自学交流论坛
) F+ X% i5 a/ y" d6 w+ k3 m4 [: a2 q. G3. 当你的表里面的数据发生了比较大的变化,一般来说,大约表里面的数据量的10%-20%发生了变化,就应该作一次runstats。这些变化包括删除,修改,插入。对于一些非常大的表,比方在数据仓库的项目里面,某些事实表非常巨大。这个时候,完整的对一个大表作runstats可能花费时间相当大,DB2 8.1里面支持我们对这些大表作抽样,比方说只对20%的数据作runstats,这样的话,一般来说也能保证得到正确的执行计划。当然首先要确保这个表里面的数据最好分布比较均匀。
' q P$ Q7 ?: m9 F: h' vwww.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 y+ K. j& w1 @# ^0 q
9 J! F& [& ` d3 ]3 B% _1 @: _) s! X$ X; B+ g
4. 当你在分区(DPF)数据库里面使用了REDISTRIBUTE DATABASE PARTITION GROUP这个命令,那么就需要用runstats来收集新的统计信息。
$ ] J5 g" Y2 N9 _我爱电脑技术社区--打造最好的电脑技术自学交流平台* G& L* N2 x+ u' h, h+ Z/ U
Y& y4 J4 b1 b' _* }* E2 C- J打造最好的电脑自学交流论坛
( L# q( s/ i2 A# ]RUNSTATS命令的语法如下:
8 d% w( K3 V3 @6 f0 w6 C8 E我爱电脑技术社区--打造最好的电脑技术自学交流平台
, G9 `3 q. [. t' U; L电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站2 f2 J% c# s {4 H9 H
1 k& i) H/ B2 F, L我爱电脑技术论坛如果表名为DB2INST1.STAFF,表上有索引,则可以用下面的例子完成RUNSTATS命令:
6 H7 J e" g/ S% J6 G5 m* `电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站& d$ N5 V ^+ ]# W) u- _
# x; }8 B" V7 M
) N: n) U! M: o6 v2 C打造最好的电脑自学交流论坛db2 runstats on table db2inst1.staff with distribution and detailed indexes all 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 v3 J* [+ s' Y# g% J8 ?+ _) x
/ U0 ]: m# a# e
( g) V* g, F) I; u8 e我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术社区--打造最好的电脑技术自学交流平台* g" _- N0 m& |7 m$ }, g, z
在实际的项目里面,对于变化比较大的表,需要我们定时对数据库做runstats,一般来说runstats和reorg可以结合起来做,首先对表作reorg,然后做runstats,最后REBIND数据库根据最新的统计信息生成合适的统计计划。
) ?" b3 c1 c/ ~; R打造最好的电脑自学交流论坛
& C2 {6 W1 D: w) {打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站# M7 k( K0 A( R
. ~3 d, E) C1 K) _" C# C! q* x电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站值得注意的是,如果我们要处理的表数据量是快速变化的,比如在电信移动行业,需要在月末进行处理的汇总表。在不长的时间范围内数据量变化特别大,从而使得RUNSTATS 得到的统计信息不准确,原因是这些统计信息只是某个时间点的信息。您可以用这条语句来把表修改为volatile。 我爱电脑技术社区--打造最好的电脑技术自学交流平台 Y+ J& J5 v; {- J/ F
( H- I6 {4 ?) }/ A2 B% y/ p
2 O, n# z4 |* f& M g9 z+ F/ Z
我爱电脑技术论坛8 ^( C9 x$ a4 J" d6 V e
alter table table_name volatile cardinality
& X3 @5 A5 N3 D' j, z6 e我爱电脑技术论坛www.520diannao.com5 G! ?2 K+ c9 C; _
4 ?6 t2 p" V; p! Z0 P0 j( w; }; M0 k打造最好的电脑自学交流论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站- K I/ a7 s8 z) j1 B
这样优化器将考虑使用索引扫描而不是表扫描。无论统计信息如何,优化器将使用索引扫描而不是使用表扫描。 打造最好的电脑自学交流论坛( X0 c( G8 f1 [# {
www.520diannao.com7 k5 o' q7 O/ C2 T; o
我爱电脑技术社区--打造最好的电脑技术自学交流平台" N' ~7 t6 j' Q( o$ ~
, R1 a# v3 D! ~: h# \打造最好的电脑自学交流论坛IBM的文档里面还提供了REORGCHK这个命令,可以根据统计公式计算表是否需要重整。 打造最好的电脑自学交流论坛 Q4 r. Y! f# C1 y' t* }
, k. a( W* _5 \: u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
, _& w4 J# |2 A& Z打造最好的电脑自学交流论坛
: D+ N5 N# r0 s- q# X. F我爱电脑技术社区--打造最好的电脑技术自学交流平台比如可以分为对系统表和用户表两部分分别进行REORGCHK: 打造最好的电脑自学交流论坛" ]6 \8 J/ V H! d! y" X
我爱电脑技术社区--打造最好的电脑技术自学交流平台' g0 W _$ X+ n* u
2 h) `- x1 A' Y9 i6 v, F打造最好的电脑自学交流论坛
; r& D( V) W: x. Q* Q6 E(1) 针对系统表进行REORGCHK: 我爱电脑技术论坛3 ~8 j& u% c0 c
4 u' R. F1 V$ \: k电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
( ] B2 |" v! P8 a* j* X3 Hwww.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站+ p9 u6 q) B" f
db2 reorgchk update statistics on table system 我爱电脑技术社区--打造最好的电脑技术自学交流平台! ]' O8 }# @1 s% z+ I& d |" T; P
www.520diannao.com, j+ W: q! z& c( P5 v& M
www.520diannao.com$ M! A. U% N5 @" K' A
( |) F. u/ c4 J. S1 M我爱电脑技术论坛(2) 针对用户表进行REORGCHK:
0 ]; S4 ?& U% s3 w9 ?) U1 Lwww.520diannao.com电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站/ U2 G5 ~" h2 p- N$ E- V
0 D6 o; x: d$ x3 M打造最好的电脑自学交流论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台. i8 }- m( Q$ y
db2 reorgchk update statistics on table user , o/ i" I' o! u2 Y* c
* _, A+ ~6 U! Y7 H. _6 n- Mwww.520diannao.com
9 Y$ a. j2 z% K0 Cwww.520diannao.comwww.520diannao.com4 K3 J; ]( G+ k5 u- G
需要注意的是,如果数据库中数据量比较大,这些操作一般所需时间比较长,所以尽量安排在数据库比较空闲的时候做。
$ B4 a9 A8 s& ?$ O电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
; t/ u- _; q3 [: r& ^7 L" E7 z电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
3 X6 l* U+ Z: R8 a) X电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛. ?& }$ X1 G# [. D% Y/ E- c
db2 update db cfg using AUTO_MAINT off AUTO_TBL_MAINT off AUTO_RUNSTATS off 我爱电脑技术论坛) l, `( e1 Z& q- V0 Q# k8 l
e8 Y+ n# u" T/ L( a我爱电脑技术社区--打造最好的电脑技术自学交流平台
0 x: Y% d* q, Q" u电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
. J6 k4 h0 b# x3 hwww.520diannao.com在DB2 8.2里面数据库可以自动进行统计信息收集,不过这样的动作还是会带来额外的负载,一般情况下面可以关掉,只在我们需要的时候运行就可以了。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站$ N( M+ @2 a0 m- m
www.520diannao.com* Z' M0 v* v; x# g
- `3 u& c+ c9 Q' `. { r
' A& q) {) S8 O1 N' j) h我爱电脑技术社区--打造最好的电脑技术自学交流平台LOAD www.520diannao.com! V+ Z# s1 Y* \9 F4 a8 H' S8 d2 p
* o/ B6 E: G0 @www.520diannao.comwww.520diannao.com {8 l g- c+ k
* x ]0 n- c" o0 I; _" {7 ^www.520diannao.comLoad这个工具是DB2里面一个非常强大的数据迁移工具。一般用作大批量的数据插入。因为Load操作不记日志,所以效率非常好。笔者曾经在RS6000平台上面实现50-60m/s的速度Load数据。在这里我想讨论的是在DB2数据库里面如何用load来影响你的catalog视图的统计信息。 我爱电脑技术论坛1 t# ]" \; b2 A7 n2 f
www.520diannao.com: ~. N \) I& p1 A0 e7 W6 O8 k
电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" R! v3 L# n3 o/ K2 C
& X! S# n/ H4 k \, x+ D8 Y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站在Load的时候使用statistics选项可以在装入的过程中生成统计数据,这些统计数据可以供优化器确定最有效的执行sql语句的方式。