1.19 import用法
DB2 IMPORT FROM GH1.OUT OF DEL MESSAGES ERR.TXT INSERT INTO DB2INST1.TB_DBF_MATCH_HA 注意要加SCHMA
1.20 values的使用
如果有多个 SET 语句给变量付值,最好使用VALUES语句,改写为一句。这样可以提高效率。
但要注意,VALUES不能将NULL值付给一个变量。
VALUES(NULL) INTO OUT_RETURN_CODE; 这个语句会报错的。
1.21 给select 语句指定隔离级别
SELECT * FROM TB_HEAD_STOCK_BALANCE WITH UR
1.22 atomic及not atomic区别
ATOMIC是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在ATOMIC块内的已经执行成功的语句也相当于没做,有点类似于TRANSACTION。
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,这样可以大大提高性能。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,不过它写起来比较麻烦。
2.6 提高INSERT性能---从游标装载
C:\\>DB2 CONNECT TO SAMPLE USER ADMINISTRATOR USING XIAOMA
数据库连接信息
数据库服务器 = DB2/NT 9.0.0 SQL 授权标识 = ADMINIST... 本地数据库别名 = SAMPLE
C:\\>DB2 CREATE TABLE NEW_STAFF AS (SELECT * FROM STAFF) DEFINITION ONLY
DB20000I SQL 命令成功完成。
C:\\>DB2 DECLARE STAFFCURSOR CURSOR FOR SELECT * FROM STAFF DB20000I SQL 命令成功完成。
C:\\>DB2 LOAD FROM STAFFCURSOR OF CURSOR INSERT INTO NEW_STAFF SQL3501W 由于对数据库禁用了正向恢复,因此,表所在的表空间将不会处于备份暂挂状态
SQL1193I
SQL3500W \阶段。
SQL3519W
SQL3520W
SQL3110N
SQL3519W
SQL3520W
SQL3515W \阶段。
读取行数跳过行数装入行数拒绝行数删除行数落实行数
实用程序开始从 SQL 语句 \装入数据。 在时间 \时,实用程序正在开始开始装入一致点。输入记录计数 = \。 “装入一致点”成功。 实用程序已完成处理。从输入文件读取了 \行。 开始装入一致点。输入记录计数 = \。 “装入一致点”成功。 在时间 \时,实用程序已完成了 = 35 = 0 = 35 = 0 = 0 = 35 2、 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 \(2) ADD COLUMN T3 INT\
3、 DB2系统管理 4.1 创建Database
CREATE DATABASE HEAD USING CODESET IBM-EUCCN TERRITORY CN; 这样可以支持中文。
4.2 手工做数据库远程(别名)配置
DB2 CATALOG TCPIP NODE NODE1 REMOTE 172.28.200.200 SERVER 50000
DB2 CATALOG DB HEAD AS TEST1 AT NODE NODE1 然后既可使用:
DB2 CONNECT TO TEST1 USER ? USING ? 连上HEAD库了
4.3 连接数据库及看当前连接数据库
连接数据库
DB2 CONNECT TO HEAD USER DB2INST1 USING DB2INST1
当前连接数据库 DB2 CONNECT
4.4 停止启动数据库head
DB2 ACTIVATE DB HEAD DB2 DEACTIVATE DB HEAD
要注意的是,如果有连接,使用DEACTIVATE DB 不起作用。