深入剖析DB2数据库应用系统的性能优化
◆设计数据库 我爱电脑技术社区--打造最好的电脑技术自学交流平台) J+ V( X8 {4 P
+ b1 R+ c# \, t' ]3 M D打造最好的电脑自学交流论坛
5 b0 Z" p8 X1 r& C5 y Wwww.520diannao.com1. 熟悉业务系统
Y5 I$ v3 z+ x5 C2 k( F0 }我爱电脑技术论坛
! X9 T/ n8 Z6 ~" x- l! s/ k我爱电脑技术论坛我爱电脑技术社区--打造最好的电脑技术自学交流平台- Z' Y T% ^3 w; D
对业务系统的熟悉程度对整个数据库系统的性能有很大影响,一个对业务不熟悉的设计人员,尽管有丰富的数据库知识,也很难设计出性能最佳的数据库应用系统。 www.520diannao.com/ _% d- h V( s5 B4 r
/ ~/ V1 Y: z5 L: k4 m电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
5 h2 t3 z. J. ^" I我爱电脑技术论坛2. 规范化与非规范化
4 @ z- I3 K/ V* @- V* p2 }我爱电脑技术论坛打造最好的电脑自学交流论坛4 u( ?' ~% x& w, Q# s6 b
! a/ F; ]; }- x5 l9 ?) a8 S* B打造最好的电脑自学交流论坛数据库被规范化后,减少了数据冗余,数据量变小,数据行变窄。这样DB2的每一页可以包括更多行,那么每一区里的数据量更多,从而加速表的扫描,改进了单个表的查询性能。但是,当查询涉及多个表的时候,需要用很多连接操作把信息从各个表中组合在一起,导致更高的CPU和I/O花销。那么,有很多时候需要在规范化和非规范化之间保持平衡,用适当的冗余信息来减少系统开销,用空间代价来换取时间代价。有订单信息表OrderDetail,它里面记录了投递员信息,收款员信息,物品信息,价格策略,客户信息…..这些信息分别在投递员信息表、收款员信息表、物品信息表、价格策略表、客户信息表中存放。如果按照规范化的要求,OrderDetail查询时就必须要与这么多个表进行连接或者嵌套查询。如果OrderDetail表中的数据量是在百万级的,那么一次查询所需要的时间可能会达到好几个小时。事实上,只要在设计时保证数据的逻辑有效性,很多信息都可以直接冗余在OrderDetail表中,这些冗余的数据能够极大的提高查询的效率,从而减少CPU和I/O操作。
! W! G) J( z, |' b$ Q9 W) P我爱电脑技术社区--打造最好的电脑技术自学交流平台
) j1 k, p6 A9 Z9 h% M& D我爱电脑技术论坛
7 {3 S# v9 a5 ]& t6 [; K3 M打造最好的电脑自学交流论坛3. 数据条带化 www.520diannao.com" f2 g1 G. m8 n! H9 A
i7 p$ ^6 y) ^: E; i4 [9 [6 N1 G2 Cwww.520diannao.com打造最好的电脑自学交流论坛$ @7 Z+ z7 ?/ r, b6 J) b( \
如果一个表的记录条数超过一定的规模,那么最基本的查询操作也会受到影响,需要将该表根据日期水平划分,把最近、最经常用的数据和历史的、不经常用的数据划分开来,或是根据地理位置、部门等等进行划分。还有一种划分方式――垂直划分,即把一个属性列很多的表分割成好几个小表,比如把经常用到的属性放在一个表里,不经常用到的属性放在另一个表里,这样可以加快表的扫描,提高效率。
; K x1 I7 n# E5 J6 y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
! N) v' C `5 e6 X. p% d: p2 ~电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
2 m' |' k A# w打造最好的电脑自学交流论坛4. 选择数据类型 www.520diannao.com n2 b6 C5 x# y- N
0 z6 ]& I9 P: z5 {: a* {5 J电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站我爱电脑技术论坛- G) K8 V* \9 t6 U4 [( f
对每一属性选择什么样的数据类型很大程度上依据表的要求,但是在不违背表要求的前提下,选择适当的数据类型可以提高系统性能。比如有text列存放一本书的信息,用BLOB而不是character(1024),BLOB存放的是指针或者文件参照变量,真正的文本信息可以放在数据库之外,从而减少数据库存储空间,使得程序运行的速度提高。DB2提供了UDT(User Defined Datatypes)功能,用户可以根据自己的需要定义自己的数据类型。
8 }/ m$ Z2 d% Z: m电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站
7 ^" l% V' Y& W. G4 b' l8 E% x$ _* N8 w我爱电脑技术社区--打造最好的电脑技术自学交流平台
5 J# i, B4 J& s+ l" ]电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站5. 选择索引
% R8 [; o. W0 i; H7 X' c2 o我爱电脑技术社区--打造最好的电脑技术自学交流平台
; J9 o6 g, {1 N; }我爱电脑技术论坛电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站7 L4 e7 V; I, C4 l. F7 w
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。使用索引可以快速、直接、有序的存取数据。索引的建立虽然加快了查询,另一方面却将低了数据更新的速度,因为新数据不仅要增加到表中,也要增加到索引中。另外,索引还需要额外的磁盘空间和维护开销。因此,要合理使用索引: 我爱电脑技术社区--打造最好的电脑技术自学交流平台9 G8 _" W- \/ |! `7 {$ A3 A; V* `; u
/ N) m5 v4 U' w. B3 V9 z- H/ \3 F
我爱电脑技术论坛9 P' e" t3 C. n& r. q R
在经常进行连接,但是没有指定为外键的属性列上建立索引。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站" a2 y& ]0 g8 ?. ~1 a0 c+ w
2 Q# d0 k0 P. _. a$ Q; w我爱电脑技术论坛
- Q. f" t. l- s* _: D: j* Dwww.520diannao.com在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。按索引来排序或分组,可以提高效率。 我爱电脑技术论坛 y3 |. u) N6 Z) A5 o7 P
5 k- _7 p. |9 T5 Y8 R我爱电脑技术社区--打造最好的电脑技术自学交流平台我爱电脑技术社区--打造最好的电脑技术自学交流平台9 _: v% _4 e, o4 M
在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。
1 k1 K! f8 y3 _* V* X" h; \我爱电脑技术社区--打造最好的电脑技术自学交流平台3 C) |3 V% \, C+ a: \
! f! e. w, n8 R$ ^; O# N5 Y. J打造最好的电脑自学交流论坛
! i" o& @. C- n! r J( }4 W我爱电脑技术社区--打造最好的电脑技术自学交流平台如果待排序的列有多个,可以在这些列上建立复合索引(compound index),即索引由多个字段复合而成。
9 G0 p! j- V1 e, H( E+ `' R打造最好的电脑自学交流论坛
3 Z4 S: o% a+ \( `; ]8 |8 y. W电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站+ w, Y, ^5 R: ?4 K3 g6 W3 ]2 l& T. W) n
◆查询优化 我爱电脑技术论坛# f: T$ E3 p8 k9 Z- o x8 h
1 z. b: F+ c8 P5 s W: y" N% T电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站打造最好的电脑自学交流论坛$ |2 [6 r, {4 S% S1 N
现在的数据库产品在系统查询优化方面已经做得越来越好,但由于用户提交的SQL语句是系统优化的基础,很难设想一个原本糟糕的查询计划经过系统的优化之后会变得高效,因此用户所写语句的优劣至关重要。下面重点说明改善用户查询计划的解决方案。 我爱电脑技术社区--打造最好的电脑技术自学交流平台) G4 `, E% c' q" }# j
' Y5 }& x3 Y3 p# `* y电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站$ }5 f9 a# S* q
1.排序
* B2 f4 j5 Z$ r' ]0 _6 ~+ z我爱电脑技术论坛www.520diannao.com9 i4 C4 d% Z% ~ {% l3 b, R
2 Z; } `& `" ^6 H
在很多时候,应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,可以避免排序的步骤,当以下的情况发生时,排序就不能省略: 打造最好的电脑自学交流论坛7 V. J2 q% `7 g3 S6 }% F
! }( y0 E8 Z d5 V
4 r& N6 b: v r3 |$ p$ [3 O# O2 h1 @5 }索引中不包括一个或几个待排序的列; 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站1 w' v+ z9 ?# w) U+ B7 H
; L# }; d" C/ I5 r1 }7 Swww.520diannao.com我爱电脑技术论坛: K7 x1 Q. Y0 s1 }4 p% p. V
group by或order by子句中列的次序与索引的次序不一样; 我爱电脑技术社区--打造最好的电脑技术自学交流平台# O3 d9 _" W4 r) c
9 E: g7 U- W: v, M/ P, {- t我爱电脑技术论坛www.520diannao.com" }3 G. ]( U3 [: v3 l) S
排序的列来自不同的表。 我爱电脑技术论坛. M+ ]5 n3 K( F3 X3 g0 ]: L" u
1 b- L: K+ N+ x( z1 s. X1 Gwww.520diannao.com
Y. M4 l/ @* M我爱电脑技术社区--打造最好的电脑技术自学交流平台为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表,尽管有时可能影响表的规范化,但相对于效率的提高是值得的。如果排序不可避免,那么应当试图简化它,如缩小排序列的范围等。 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站 w, j- ~4 d7 Y. z7 r
我爱电脑技术社区--打造最好的电脑技术自学交流平台/ T+ r$ \9 ~; q% g/ n
2.主键 www.520diannao.com. ~ s5 y$ ?; m8 }4 L3 V+ I+ h
+ k- C) G+ o9 ^: b0 x* Pwww.520diannao.com
& {7 Q4 t: ~. o3 |! _# v我爱电脑技术社区--打造最好的电脑技术自学交流平台主键用整型会极大的提高查询效率,而字符型的比较开销要比整型的比较开销大很多,用字符型数据作主键会使数据插入、更新与查询的效率降低。数据量小的时候这点降低可能不会被注意,可是当数据量大的时候,小的改进也能够提高系统的响应速度。
" e! s! G- v" _$ L! V xwww.520diannao.com
% w( C5 B' O/ B; t( a9 D我爱电脑技术社区--打造最好的电脑技术自学交流平台www.520diannao.com) [- g6 y6 c7 l$ o: t( Y4 [
3.嵌套查询
6 L0 ~1 H0 C- F( h7 N3 c c
; l& _# w6 n9 r. g+ g) C) Fwww.520diannao.com7 h- m& R( m# ?6 ~' b! G8 t* _* d
在SQL语言中,一个查询块可以作为另一个查询块中谓词的一个操作数。因此,SQL查询可以层层嵌套。例如在一个大型分布式数据库系统中,有订单表Order、订单信息表OrderDetail,如果需要两表关联查询:
# B6 x* V# A2 t9 I# U/ n3 J- `www.520diannao.com3 n- Y, T$ I1 x2 c
* D( V- w* g& }% b6 z: l; Q& ^
SELECT CreateUser 4 \3 x' X) Y0 f; Y
+ _$ k! J* i1 t9 k. P4 {打造最好的电脑自学交流论坛FROM Order 电脑,技术,IT,学习,交流,网络安全,QQ,硬件,软件,编程,教程,建站4 w+ e2 {9 o" S' M0 c8 C
我爱电脑技术论坛5 R q+ K- W- _3 y
WHERE OrderNo IN 打造最好的电脑自学交流论坛& N* F6 v) I9 ?+ V
我爱电脑技术论坛& _ R# s' Z, F3 b7 g6 ^
( SELECT OrderNo 我爱电脑技术论坛; z$ K$ J9 \0 E8 l7 P; ?
b2 D' {! ~. R" e8 X$ G+ HFROM OrderDetail
' D) j4 B" S, s3 t+ m; W, s Iwww.520diannao.com# M" d* f7 C& O8 C6 T
WHERE Price=0.5)
' U& E4 U3 @( {( P# Z; s' [www.520diannao.com 我爱电脑技术社区--打造最好的电脑技术自学交流平台/ U+ `1 j, U$ k$ P4 w3 S& n
我爱电脑技术社区--打造最好的电脑技术自学交流平台. C: N7 `2 r+ s [, K' c% T
& A( n7 c' n5 x" m4 }$ N" y& x* q7 bwww.520diannao.comwww.520diannao.com& h) _6 W* f* N$ y
( K9 k2 v/ J/ |. h! W打造最好的电脑自学交流论坛我爱电脑技术论坛4 q$ X& P6 D2 |) f9 J5 R; x2 a
在这个查询中,找出报纸单价为0.5元的收订员名单。下层查询返回一组值给上层查询,然后由上层查询块再根据下层块提供的值继续查询。在这种嵌套查询中,对上层查询的每一个值OrderNo,下层查询都要对表OrderDetail进行全部扫描,执行效率显然不会高。在该查询中,有2层嵌套,如果每层都查询1000行,那么这个查询就要查询100万行数据。在系统开销中,对表Order的扫描占82%,对表OrderDetail的搜索占16%。如果我们用连接来代替,即:
, t$ e4 }" y! a5 q9 u* t' J
4 h2 t2 U2 R# i: _9 ]* i0 Q3 c6 }我爱电脑技术社区--打造最好的电脑技术自学交流平台/ H2 a/ w! y$ i8 M* z
SELECT CreateUser
" F3 ^4 Q6 H* A6 O+ [/ d我爱电脑技术社区--打造最好的电脑技术自学交流平台打造最好的电脑自学交流论坛, W$ }5 q3 n& ]8 z+ ]# s0 @
FROM Order,OrderDetail
5 C0 N3 p7 ^/ u. W& D% ?* D我爱电脑技术社区--打造最好的电脑技术自学交流平台
. U+ m) m* n3 awww.520diannao.comWHERE Order.OrderNo=OrderDetail.OrderNo AND Praice=0.5