技术开发 频道

DB2编程基础要点

    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才可以创建成功。

    3.6 修改表结构

    一次给一个表增加多个字段

    db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int"

    4 DB2系统管理

    4.1 DB2安装

    在Windows 98 下安装db2 7.1 或其他版本,如果有Jdbc错误或者是Windwos 98不能启动,则将autoexec.bat 中的内容用如下内容替换:

    C:\PROGRA~1\TRENDP~1\PCSCAN.EXE C:\ C:\WINDOWS\COMMAND\ /NS /WIN95

    rem C:\WINDOWS\COMMAND.COM /E:32768

    REM [Header]

    REM [CD-ROM Drive]

    REM [Miscellaneous]

    REM [Display]

    set PATH=%PATH%;C:\MSSQL\BINN;C:\PROGRA~1\SQLLIB\BIN;C:\PROGRA~1\SQLLIB\FUNCTION;C:\PROGRA~1\SQLLIB\SAMPLES\REPL;C:\PROGRA~1\SQLLIB\HELP

    IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMQENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMQENV.BAT

    IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT

    set DB2INSTANCE=DB2

    set CLASSPATH=.;C:\PROGRA~1\SQLLIB\java\db2java.zip;C:\PROGRA~1\SQLLIB\java\runtime.zip;C:\PROGRA~1\SQLLIB\java\sqlj.zip;C:\PROGRA~1\SQLLIB\bin

    set MDIS_PROFILE=C:\PROGRA~1\SQLLIB\METADATA\PROFILES

    set LC_ALL=ZH_CN

    set INCLUDE=C:\PROGRA~1\SQLLIB\INCLUDE;C:\PROGRA~1\SQLLIB\LIB;C:\PROGRA~1\SQLLIB\TEMPLATES\INCLUDE

    set LIB=C:\PROGRA~1\SQLLIB\LIB

    set DB2PATH=C:\PROGRA~1\SQLLIB

    set DB2TEMPDIR=C:\PROGRA~1\SQLLIB

    set VWS_TEMPLATES=C:\PROGRA~1\SQLLIB\TEMPLATES

    set VWS_LOGGING=C:\PROGRA~1\SQLLIB\LOGGING

    set VWSPATH=C:\PROGRA~1\SQLLIB

    set VWS_FOLDER=IBM DB2

    set ICM_FOLDER=信息目录管理器

    4.2 创建Database

    create database head using codeset IBM-eucCN territory CN;

    这样可以支持中文。

0
相关文章