服务器 频道

DB2编程序技巧 (三)

  【IT168 服务器学院】1.16 存储过程fence及unfence
  fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。
  一般而言,fence的存储过程比较安全。
  但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。
  
  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,不过它写起来比较麻烦。
  
0
相关文章