查看完整版本: DB2编程序技巧 (六)

豹子 2007-6-23 09:48

DB2编程序技巧 (六)

2.2 SQL语句尽量写复杂SQL ^"g Pt8y!oV:jZ
尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。 5jFgM9r4\{ ]#V*M
DB2的SQLEngieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。 Sja3L \z\a(T/P
Oracle则相反,推荐将复杂的语句简单化,SQLEngieer的优化能力不是特别好。
d^#X8`ZIx 这是因为每一个SQL语句都会有resetSQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。 3H ]2W"U&SW!}#^
一个总的思想就是尽量减少SQL语句的个数。 6Og1D@]MT'},~9R
2.3 SQLSP及CSP的选择
(mRR{%r!~O B 首先,C的sp的性能比sql的sp的要高。
5A$d)^O_})S1R#\B 一般而言,SQL语句比较复杂,而逻辑比较简单,sqlsp与csp的性能差异会比较小,这样从工作量考虑,用SQL写比较好。 )[0s?*O!nW%b
而如果逻辑比较复杂,SQL比较简单,用c写比较好。
'X4r4\"\2S_g }-[[9dcF [
2.4 查询的优化(HASH及RR_TO_RS) cAE/@n4}*h~6f
db2set DB2_HASH_JOIN=Y (HASH排序优化) ZyS4L%]'L!upb
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
4v]*GfU;` P{A7W8y 剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下72秒。
eu0{7W)IH,p;]P"q Nm-];K5\
db2set DB2_RR_TO_RS=Y /},G1j#d M:a
该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
(A^/KjRq+d8@5\g 这样,db2不用管理Nextkey,可以少管理一些东西,这样可以提高性能。 | T*{eS @E+O

{6ok.C_VZ
7rn i C7Sf Rb 2.5 避免使用count(*)及exists的方法
3u+b.ZH jw:I e/S X 1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。 &Wm Mjq ['O'[
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。 ?TUb On
Q|-t3L}2K'a}
如果做这两中操作的目的是为 4b$Nb['^,v4E
selectinto服务的话,就可以省略掉这两步。 C%v-C5r$Z0fv
直接使用selectinto选择记录中的字段。
!H"^ rcN/OU `p:p4jbI,Q
如果是没有记录选择到的话,db2会将sqlcode=100和sqlstate=’20000’
RI tQP_G 如果是有多条记录的话,db2会产生一个错误。 ;x+Rn!YSm#J K

R)w9@ Zp5v4K-W5e:Z 程序可以创建continuehandlerforexception "G VPhgAN
continuehandlerfornotfound
[)DC,PIB yA 来检测。
-ui*z$b6MmY{ WI 这是最快速的方法。 :P5\A$U2u.VJ

}hI{iE-N? `\ 3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*)要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。 S y8j.|C-J

(r|,\ ?9C aD Ca
}[ D7pr"p 3 DB2表及sp管理 5H/Kr9tKU+T
3.1 看存储过程文本
BH@}.kj2F[u{ selecttextfromsyscat.procedureswhereprocname='PROC1';
._5Z6xNU6{;e f:q 3.2 看表结构 7U5wN:P1~
describetablesyscat.procedures
*J9Cp4S-s describeselect*fromsyscat.procedures i)E2x.p"b la-MTj2L
F%xLl9M oY c
3.3 查看各表对sp的影响(被哪些sp使用) 5H F0y2F up|4I1C
selectPROCNAMEfromSYSCAT.PROCEDURESwhereSPECIFICNAMEin(selectdnamefromsysibm.sysdependencieswherebnamein(selectPKGNAMEfromsyscat.packagedepwherebname='TB_BRANCH'))
页: [1]
查看完整版本: DB2编程序技巧 (六)