分类:
2008-04-14 20:50:18
来源:赛迪网 作者:yashi |
◆1.17 SP错误处理用法
如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。
处理办法:
定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,
在CALL SPNAME之后, SET V_STATUS = 1,
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
IF V_STATUS <> 1 THEN
--警告处理,插入日志
SET V_STATUS = 0;
END IF;
END;
◆1.18 import用法
db2 import from gh1.out of DEL messages err.txt insert into db2inst1.tb_dbf_match_ha
注意要加schma。
◆1.19 values的使用
如果有多个 set 语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。
但要注意,values不能将null值付给一个变量。
values(null) into out_return_code;
这个语句会报错的。
◆1.20 给select 语句指定隔离级别
select * from tb_head_stock_balance with ur
◆1.21 atomic及not atomic区别
atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。
2.DB2编程性能注意
◆2.1 大数据的导表
应该是export后再load性能更好,因为load不写日志。比select into 要好。
◆2.2 SQL语句尽量写复杂SQL
尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。DB2的 SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。Oracle 则相反,推荐将复杂的语句简单化, SQL Engieer的优化能力不是特别好。这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。一个总的思想就是尽量减少SQL语句的个数。
◆2.3 SQL SP及C SP的选择
首先,C的sp的性能比sql 的sp 的要高。一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。而如果逻辑比较复杂,SQL比较简单,用c写比较好。
◆2.4 查询的优化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y (HASH排序优化)
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下 72秒。
db2set DB2_RR_TO_RS=Y
该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。
◆2.5 避免使用count(*) 及exists的方法
(1)首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。
(2)exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。
如果做这两中操作的目的是为select into服务的话,就可以省略掉这两步。
直接使用select into 选择记录中的字段。
如果是没有记录选择到的话,db2 会将 sqlcode=100 和 sqlstate=’20000’
如果是有多条记录的话,db2会产生一个错误。
程序可以创建 continue handler for exception
continue handler for not found 来检测。
这是最快速的方法。
(3)如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。
3. DB2表及sp管理
◆3.1 看存储过程文本
select text from syscat.procedures where procname='PROC1';
◆3.2 看表结构
describe table syscat.procedures describe select * from syscat.procedures
◆3.3 查看各表对sp的影响(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname='TB_BRANCH'))
◆3.4 查看sp使用了哪些表
select bname from syscat.packagedep where btype='T' and pkgname in(select bname from sysibm.sysdependencies where dname in (select specificname from syscat.procedures where procname='PR_CLEAR_MATCH_DIVIDE_SHA'))
◆3.5 查看function被哪些sp使用
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname in (select SPECIFICNAME from SYSCAT.functions where funcname='GET_CURRENT_DATE')))
使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。
必须先创建function,调用该function的sp才可以创建成功。 |