DB2编程序技巧 (六)
2.2 SQL语句尽量写复杂SQL
; y" u" X9 D" ^4 m3 w# H尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。 # `/ @( l6 e$ E! q
DB2的SQLEngieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。
" }6 r! ?: W: d! g& v5 D) M7 VOracle则相反,推荐将复杂的语句简单化,SQLEngieer的优化能力不是特别好。 2 R1 v9 S! n( g* `
这是因为每一个SQL语句都会有resetSQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。 2 m* z; n7 e; I6 r/ q
一个总的思想就是尽量减少SQL语句的个数。
2 m' f+ Q4 `, `( S( i2.3 SQLSP及CSP的选择
+ `) C Z* k% n1 ` |首先,C的sp的性能比sql的sp的要高。
# N b' p- S) b/ m/ ]- C5 m0 m一般而言,SQL语句比较复杂,而逻辑比较简单,sqlsp与csp的性能差异会比较小,这样从工作量考虑,用SQL写比较好。 1 C! m1 J+ j5 p1 ~- n( T8 O) b
而如果逻辑比较复杂,SQL比较简单,用c写比较好。
2 C" u. @7 L9 |0 Q- c' P# _- G
3 D% v- `$ h1 |0 J4 Y: z8 C* Q5 T& }+ e2.4 查询的优化(HASH及RR_TO_RS)
- H1 h# T \5 O1 _3 @* ~db2set DB2_HASH_JOIN=Y (HASH排序优化) & O# }) A" y( j0 s5 q/ I
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。 , h- B S' ^: v' P2 }# C# z: u
剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下72秒。
4 W3 W% q1 o9 b
" T/ r2 ]% g" R0 f U$ d8 j0 Vdb2set DB2_RR_TO_RS=Y
8 P& j' q h9 x7 N9 y6 S) L% c. V该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS. $ u. L \- \, j8 T& s- [( [
这样,db2不用管理Nextkey,可以少管理一些东西,这样可以提高性能。
- _ E+ _2 d1 m+ ~# h/ B2 m k! _6 ~, J
0 _) K' j4 U0 `7 P1 h5 C
2.5 避免使用count(*)及exists的方法 ) L, K3 b- j0 j
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。 + ?% Y: s5 C& E: M) @
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。
1 b ~! g$ |% G7 y: X) q( w+ M# j
( \" u+ Z2 X+ X& c& G如果做这两中操作的目的是为
7 F; g8 m! x3 Lselectinto服务的话,就可以省略掉这两步。
2 ~7 G8 Y9 a2 z/ S {直接使用selectinto选择记录中的字段。 8 ^+ k3 w7 E( ^. g; p0 p# j9 b
+ |4 j: p9 g! p/ U
如果是没有记录选择到的话,db2会将sqlcode=100和sqlstate=’20000’
0 ]# P4 E5 m" M; O$ n3 X0 t1 N如果是有多条记录的话,db2会产生一个错误。 7 l& n1 w7 D( S& V6 ~
& t6 x! o5 C: |0 ?/ B5 r A4 e
程序可以创建continuehandlerforexception . e) A( C/ b6 D$ @4 F7 F0 y, l. G
continuehandlerfornotfound ' h$ `7 d1 f2 j! `% A- C
来检测。 1 Q, L: j- F7 N! v& B) \
这是最快速的方法。
- }0 p; Q( h& x( x" O) a2 Q3 [( \9 |4 b
3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*)要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。 9 b' v2 C0 N2 c1 D0 s
* Y/ e4 [5 n ~2 j; ?* t( C! l g _$ R/ S' p* X
3 DB2表及sp管理
/ h3 Q4 w0 k" ^( ~. P3.1 看存储过程文本
* ?' P) o7 k# Vselecttextfromsyscat.procedureswhereprocname='PROC1'; ) A- L' M( |, D C
3.2 看表结构
) Z1 \) m: O& Y F: h3 g; R N$ Zdescribetablesyscat.procedures
7 Y9 m; u% S/ R9 }% |1 _describeselect*fromsyscat.procedures . j# H+ ^# N- l; W$ K
4 J# K$ @0 e0 a* y5 p
3.3 查看各表对sp的影响(被哪些sp使用)
( p' v/ V# d* CselectPROCNAMEfromSYSCAT.PROCEDURESwhereSPECIFICNAMEin(selectdnamefromsysibm.sysdependencieswherebnamein(selectPKGNAMEfromsyscat.packagedepwherebname='TB_BRANCH'))
点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹