分享

DB2编程序小小技巧

 WindySky 2007-11-14
一些编程经验,与大家共享!Mqzitug
Mqzitug
1        DB2编程        Mqzitug
1.1        建存储过程时CREATE 后一定不要用TAB键        3Mqzitug
1.2        使用临时表        3Mqzitug
1.3        从数据表中取指定前几条记录        3Mqzitug
1.4        游标的使用        4Mqzitug
注意commit和rollback        4Mqzitug
游标的两种定义方式        4Mqzitug
修改游标的当前记录的方法        5Mqzitug
1.5        类似DECODE的转码操作        5Mqzitug
1.6        类似CHARINDEX查找字符在字串中的位置        5Mqzitug
1.7        类似DATEDIF计算两个日期的相差天数        5Mqzitug
1.8        写UDF的例子        5Mqzitug
1.9        创建含IDENTITY值(即自动生成的ID)的表        6Mqzitug
1.10        预防字段空值的处理        6Mqzitug
1.11        取得处理的记录数        6Mqzitug
1.12        从存储过程返回结果集(游标)的用法        6Mqzitug
1.13        类型转换函数        8Mqzitug
1.14        存储过程的互相调用        8Mqzitug
1.15        C存储过程参数注意        8Mqzitug
1.16        存储过程FENCE及UNFENCE        8Mqzitug
1.17        SP错误处理用法        9Mqzitug
1.18        IMPORT用法        9Mqzitug
1.19        VALUES的使用        9Mqzitug
1.20        给SELECT 语句指定隔离级别        10Mqzitug
1.21        ATOMIC及NOT ATOMIC区别        10Mqzitug
2        DB2编程性能注意        10Mqzitug
2.1        大数据的导表        10Mqzitug
2.2        SQL语句尽量写复杂SQL        10Mqzitug
2.3        SQL  SP及C SP的选择        10Mqzitug
2.4        查询的优化(HASH及RR_TO_RS)        11Mqzitug
2.5        避免使用COUNT(*) 及EXISTS的方法        11Mqzitug
3        DB2表及SP管理        12Mqzitug
3.1        看存储过程文本        12Mqzitug
3.2        看表结构        12Mqzitug
3.3        查看各表对SP的影响(被哪些SP使用)        12Mqzitug
3.4        查看SP使用了哪些表        12Mqzitug
3.5        查看FUNCTION被哪些SP使用        12Mqzitug
3.6        修改表结构        12Mqzitug
4        DB2系统管理        13Mqzitug
4.1        DB2安装        13Mqzitug
4.2        创建DATABASE        14Mqzitug
4.3        手工做数据库远程(别名)配置        14Mqzitug
4.4        停止启动数据库实例        14Mqzitug
4.5        连接数据库及看当前连接数据库        14Mqzitug
4.6        停止启动数据库HEAD        15Mqzitug
4.7        查看及停止数据库当前的应用程序        15Mqzitug
4.8        查看本INSTANCE下有哪些DATABASE        15Mqzitug
4.9        查看及更改数据库HEAD的配置        16Mqzitug
4.9.1        改排序堆的大小        16Mqzitug
4.9.2        改事物日志的大小        16Mqzitug
4.9.3        出现程序堆内存不足时修改程序堆内存大小        16Mqzitug
4.10        查看及更改数据库实例的配置        16Mqzitug
4.10.1        打开对锁定情况的监控。        16Mqzitug
4.10.2        更改诊断错误捕捉级别        17Mqzitug
4.11        DB2环境变量        17Mqzitug
4.12        DB2命令环境设置        17Mqzitug
4.13        改变隔离级别        17Mqzitug
4.14        管理DBINSTANCE的参数        18Mqzitug
4.15        升级后消除版本问题        18Mqzitug
4.16        查看数据库表的死锁        18Mqzitug
Mqzitug
1        DB2编程Mqzitug
1.1        建存储过程时Create 后一定不要用TAB键Mqzitug
create        procedureMqzitug
的create后只能用空格,而不可用tab健,否则编译会通不过。Mqzitug
切记,切记。Mqzitug
Mqzitug
1.2        使用临时表Mqzitug
Mqzitug
  要注意,临时表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建临时表的。Mqzitug
  另外,DB2的临时表和sybase及oracle的临时表不太一样,DB2的临时表是在一个session内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。Mqzitug
   建临时表时最好加上  with  replace选项,这样就可以不显示的drop 临时表,建临时表时如果不加该选项而该临时表在该session内已创建且没有drop,这时会发生错误。Mqzitug
1.3        从数据表中取指定前几条记录Mqzitug
select  *  from tb_market_code fetch first 1 rows onlyMqzitug
Mqzitug
但下面这种方式不允许Mqzitug
select market_code into v_market_code Mqzitug
        from tb_market_code fetch first 1 rows only;     Mqzitug
    Mqzitug
        选第一条记录的字段到一个变量以以下方式代替Mqzitug
    declare v_market_code char(1);Mqzitug
    declare cursor1 cursor for select market_code from tb_market_code Mqzitug
        fetch first 1 rows only for update;Mqzitug
    open cursor1;Mqzitug
    fetch cursor1 into v_market_code;Mqzitug
    close cursor1;Mqzitug
Mqzitug
1.4        游标的使用Mqzitug
注意commit和rollbackMqzitug
使用游标时要特别注意如果没有加with hold 选项,在Commit和Rollback时,该游标将被关闭。Commit 和Rollback有很多东西要注意。特别小心Mqzitug
Mqzitug
游标的两种定义方式Mqzitug
一种为Mqzitug
declare continue handler for not foundMqzitug
   beginMqzitug
     set v_notfound = 1;Mqzitug
   end;Mqzitug
Mqzitug
declare cursor1 cursor with hold for select market_code from tb_market_code         for update;Mqzitug
open cursor1;Mqzitug
set v_notfound=0;Mqzitug
fetch cursor1 into v_market_code;Mqzitug
while v_notfound=0 DoMqzitug
                --workMqzitug
                set v_notfound=0;Mqzitug
fetch cursor1 into v_market_code;Mqzitug
end while;Mqzitug
close cursor1;Mqzitug
这种方式使用起来比较复杂,但也比较灵活。特别是可以使用with hold 选项。如果循环内有commit或rollback 而要保持该cursor不被关闭,只能使用这种方式。Mqzitug
  另一种为Mqzitug
             pcursor1: for loopcs1 as  cousor1  cursor  asMqzitug
                                select  market_code  as market_codeMqzitug
           from tb_market_codeMqzitug
           for updateMqzitug
        doMqzitug
        end for;Mqzitug
       这种方式的优点是比较简单,不用(也不允许)使用open,fetch,close。Mqzitug
  但不能使用with  hold 选项。如果在游标循环内要使用commit,rollback则不能使用这种方式。如果没有commit或rollback的要求,推荐使用这种方式(看来For这种方式有问题)。Mqzitug
Mqzitug
修改游标的当前记录的方法Mqzitug
update tb_market_code set market_code='0' where current of cursor1;Mqzitug
不过要注意将cursor1定义为可修改的游标Mqzitug
  declare cursor1 cursor for select market_code from tb_market_code Mqzitug
        for update;Mqzitug
Mqzitug
for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。Mqzitug
Mqzitug
        Mqzitug
Mqzitug
1.5        类似decode的转码操作Mqzitug
oracle中有一个函数         select decode(a1,'1','n1','2','n2','n3') aa1 fromMqzitug
db2没有该函数,但可以用变通的方法Mqzitug
select case a1 Mqzitug
                when '1' then 'n1' Mqzitug
                when '2' then 'n2' Mqzitug
                else 'n3'Mqzitug
          end as aa1 fromMqzitug
Mqzitug
1.6        类似charindex查找字符在字串中的位置Mqzitug
Locate(‘y’,’dfdasfay’)Mqzitug
        查找’y’ 在’dfdasfay’中的位置。Mqzitug
Mqzitug
1.7        类似datedif计算两个日期的相差天数Mqzitug
days(date(‘2001-06-05’)) – days(date(‘2001-04-01’))Mqzitug
days 返回的是从  0001-01-01 开始计算的天数Mqzitug
1.8        写UDF的例子Mqzitug
C写见sqllibsamplescliudfsrv.cMqzitug
Mqzitug
1.9        创建含identity值(即自动生成的ID)的表Mqzitug
建这样的表的写法Mqzitug
CREATE TABLE testMqzitug
     (t1 SMALLINT NOT NULLMqzitug
        GENERATED ALWAYS AS IDENTITYMqzitug
        (START WITH 500, INCREMENT BY 1),Mqzitug
      t2 CHAR(1));Mqzitug
在一个表中只允许有一个identity的column.Mqzitug
Mqzitug
1.10        预防字段空值的处理Mqzitug
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPTMqzitug
FROM DEPARTMENTMqzitug
   COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。Mqzitug
   和oracle的isnull类似,但isnull好象只能两个表达式。Mqzitug
     Mqzitug
Mqzitug
1.11        取得处理的记录数Mqzitug
        declare v_count int;Mqzitug
update        tb_test                set                t1=’0’Mqzitug
                where        t2=’2’;Mqzitug
        --检查修改的行数,判断指定的记录是否存在Mqzitug
        get diagnostics        v_ count=ROW_COUNT;     Mqzitug
        只对update,insert,delete起作用.Mqzitug
        不对select into 有效Mqzitug
Mqzitug
Mqzitug
1.12        从存储过程返回结果集(游标)的用法Mqzitug
1、建一sp返回结果集Mqzitug
CREATE PROCEDURE DB2INST1.Proc1 (  )Mqzitug
    LANGUAGE SQLMqzitug
    result sets 2(返回两个结果集)Mqzitug
------------------------------------------------------------------------Mqzitug
-- SQL 存储过程 Mqzitug
------------------------------------------------------------------------Mqzitug
P1: BEGINMqzitug
        declare c1 cursor  with return to caller for Mqzitug
            select  market_codeMqzitug
            from    tb_market_code;Mqzitug
        --指定该结果集用于返回给调用者Mqzitug
        declare c2 cursor  with return to caller for Mqzitug
            select  market_codeMqzitug
            from    tb_market_code;Mqzitug
         open c1;Mqzitug
         open c2;Mqzitug
END P1                                       Mqzitug
Mqzitug
Mqzitug
2、建一SP调该sp且使用它的结果集Mqzitug
Mqzitug
CREATE PROCEDURE DB2INST1.Proc2 (Mqzitug
out out_market_code char(1))Mqzitug
    LANGUAGE SQLMqzitug
------------------------------------------------------------------------Mqzitug
-- SQL 存储过程 Mqzitug
------------------------------------------------------------------------Mqzitug
P1: BEGINMqzitug
Mqzitug
declare loc1,loc2 result_set_locator varying; Mqzitug
--建立一个结果集数组Mqzitug
call proc1;Mqzitug
--调用该SP返回结果集。Mqzitug
associate result set locator(loc1,loc2) with procedure proc1;Mqzitug
--将返回结果集和结果集数组关联Mqzitug
allocate cursor1 cursor for result set loc1;Mqzitug
allocate cursor2 cursor for result set loc2;Mqzitug
--将结果集数组分配给cursorMqzitug
fetch  cursor1 into out_market_code;Mqzitug
--直接从结果集中赋值Mqzitug
close cursor1;         Mqzitug
Mqzitug
END P1Mqzitug
Mqzitug
3、动态SQL写法Mqzitug
     DECLARE CURSOR C1 FOR STMT1; Mqzitug
     PREPARE STMT1 FROMMqzitug
        'ALLOCATE C2 CURSOR FOR RESULT SET ?';Mqzitug
4、注意:Mqzitug
一、        如果一个sp调用好几次,只能取到最近一次调用的结果集。Mqzitug
二、        allocate的cursor不能再次open,但可以close,是close sp中的对应cursor。Mqzitug
Mqzitug
1.13        类型转换函数Mqzitug
select cast ( current time as char(8)) from tb_market_codeMqzitug
Mqzitug
1.14        存储过程的互相调用Mqzitug
目前,c sp可以互相调用。Mqzitug
Sql sp 可以互相调用,Mqzitug
Sql sp 可以调用C sp,Mqzitug
但C sp 不可以调用Sql sp(最新的说法是可以)Mqzitug
Mqzitug
1.15        C存储过程参数注意Mqzitug
create procedure pr_clear_task_ctrl(Mqzitug
                                        IN IN_BRANCH_CODE char(4),Mqzitug
                      IN IN_TRADEDATE   char(8),Mqzitug
                                  IN IN_TASK_ID     char(2),Mqzitug
                               IN IN_SUB_TASK_ID char(4),Mqzitug
                               OUT OUT_SUCCESS_FLAG INTEGER )Mqzitug
Mqzitug
DYNAMIC RESULT SETS 0Mqzitug
LANGUAGE C Mqzitug
PARAMETER STYLE GENERAL WITH NULLS(如果不是这样,sql 的sp将不能调用该用c写的存储过程,产生保护性错误)Mqzitug
NO DBINFOMqzitug
FENCEDMqzitug
MODIFIES SQL DATAMqzitug
EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@Mqzitug
Mqzitug
Mqzitug
1.16        存储过程fence及unfenceMqzitug
fence的存储过程单独启用一个新的地址空间,而unfence的存储过程和调用它的进程使用同一个地址空间。Mqzitug
一般而言,fence的存储过程比较安全。Mqzitug
但有时一些特殊的要求,如要取调用者的pid,则fence的存储过程会取不到,而只有unfence的能取到。Mqzitug
Mqzitug
1.17        SP错误处理用法Mqzitug
如果在SP中调用其它的有返回值的,包括结果集、临时表和输出参数类型的SP,Mqzitug
DB2会自动发出一个SQLWarning。而在我们原来的处理中对于SQLWarning都Mqzitug
会插入到日志,这样子最后会出现多条SQLCODE=0的警告信息。Mqzitug
处理办法:Mqzitug
定义一个标志变量,比如DECLARE V_STATUS INTEGER DEFAULT 0,Mqzitug
在CALL SPNAME之后, SET V_STATUS = 1,Mqzitug
DECLARE CONTINUE HANDLER FOR SQLWARNINGMqzitug
BEGINMqzitug
        IF V_STATUS <>; 1 THENMqzitug
                --警告处理,插入日志Mqzitug
                SET V_STATUS = 0;Mqzitug
        END IF;Mqzitug
END;Mqzitug
1.18        import用法Mqzitug
db2 import  from  gh1.out   of  DEL messages err.txt insert into  db2inst1.tb_dbf_match_haMqzitug
Mqzitug
注意要加schmaMqzitug
Mqzitug
1.19        values的使用Mqzitug
如果有多个 set  语句给变量付值,最好使用values语句,改写为一句。这样可以提高效率。Mqzitug
Mqzitug
但要注意,values不能将null值付给一个变量。Mqzitug
values(null) into out_return_code;Mqzitug
这个语句会报错的。Mqzitug
Mqzitug
Mqzitug
1.20        给select 语句指定隔离级别Mqzitug
select * from tb_head_stock_balance with urMqzitug
Mqzitug
1.21        atomic及not atomic区别Mqzitug
atomic是将该部分程序块指定为一个整体,其中任何一个语句失败,则整个程序块都相当于没做,包括包含在atomic块内的已经执行成功的语句也相当于没做,有点类似于transaction。Mqzitug
Mqzitug
Mqzitug
2         DB2编程性能注意Mqzitug
2.1        大数据的导表Mqzitug
应该是export后再load性能更好,因为load不写日志。Mqzitug
比select into 要好。Mqzitug
Mqzitug
2.2        SQL语句尽量写复杂SQLMqzitug
   尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。Mqzitug
   DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。Mqzitug
        Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。Mqzitug
                这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。Mqzitug
                一个总的思想就是尽量减少SQL语句的个数。Mqzitug
2.3        SQL  SP及C SP的选择Mqzitug
首先,C的sp的性能比sql 的sp 的要高。Mqzitug
一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。Mqzitug
        而如果逻辑比较复杂,SQL比较简单,用c写比较好。Mqzitug
Mqzitug
2.4        查询的优化(HASH及RR_TO_RS)Mqzitug
db2set         DB2_HASH_JOIN=Y                (HASH排序优化)Mqzitug
   指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。Mqzitug
   剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下  72秒。Mqzitug
Mqzitug
db2set         DB2_RR_TO_RS=Y       Mqzitug
         该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.Mqzitug
        这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。     Mqzitug
Mqzitug
Mqzitug
2.5        避免使用count(*) 及exists的方法Mqzitug
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。Mqzitug
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。Mqzitug
Mqzitug
如果做这两中操作的目的是为Mqzitug
       select into 服务的话,就可以省略掉这两步。Mqzitug
直接使用select into 选择记录中的字段。Mqzitug
Mqzitug
如果是没有记录选择到的话,db2 会将  sqlcode=100 和 sqlstate=’20000’Mqzitug
如果是有多条记录的话,db2会产生一个错误。Mqzitug
Mqzitug
程序可以创建  continue handler for  exception Mqzitug
              continue handler for  not foundMqzitug
来检测。Mqzitug
这是最快速的方法。Mqzitug
Mqzitug
3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。Mqzitug
Mqzitug
Mqzitug
3        DB2表及sp管理Mqzitug
3.1        看存储过程文本Mqzitug
select text from syscat.procedures where procname='PROC1';Mqzitug
3.2        看表结构Mqzitug
describe table syscat.proceduresMqzitug
describe select * from syscat.proceduresMqzitug
Mqzitug
3.3        查看各表对sp的影响(被哪些sp使用)Mqzitug
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'))Mqzitug
Mqzitug
3.4        查看sp使用了哪些表Mqzitug
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'))Mqzitug
3.5        查看function被哪些sp使用Mqzitug
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')))Mqzitug
Mqzitug
Mqzitug
使用function时要注意,如果想drop 掉该function必须要先将调用该function的其它存储过程全部drop掉。Mqzitug
        必须先创建function,调用该function的sp才可以创建成功。Mqzitug
3.6        修改表结构Mqzitug
一次给一个表增加多个字段Mqzitug
db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int"Mqzitug
Mqzitug
Mqzitug
4        DB2系统管理Mqzitug
4.1        DB2安装Mqzitug
  在Windows 98 下安装db2 7.1 或其他版本,如果有Jdbc错误或者是Windwos 98不能启动,则将autoexec.bat 中的内容用如下内容替换:Mqzitug
Mqzitug
Mqzitug
C:PROGRA~1TRENDP~1PCSCAN.EXE C: C:WINDOWSCOMMAND /NS /WIN95 Mqzitug
rem C:WINDOWSCOMMAND.COM /E:32768Mqzitug
REM [Header]Mqzitug
Mqzitug
REM [CD-ROM Drive]Mqzitug
Mqzitug
REM [Miscellaneous]Mqzitug
Mqzitug
REM [Display]Mqzitug
Mqzitug
set PATH=%PATH%;C:MSSQLBINN;C:PROGRA~1SQLLIBBIN;C:PROGRA~1SQLLIBFUNCTION;C:PROGRA~1SQLLIBSAMPLESREPL;C:PROGRA~1SQLLIBHELPMqzitug
IF EXIST C:PROGRA~1IBMIMNNQIMQENV.BAT CALL C:PROGRA~1IBMIMNNQIMQENV.BATMqzitug
IF EXIST C:PROGRA~1IBMIMNNQIMNENV.BAT CALL C:PROGRA~1IBMIMNNQIMNENV.BATMqzitug
set DB2INSTANCE=DB2Mqzitug
set CLASSPATH=.;C:PROGRA~1SQLLIBjavadb2java.zip;C:PROGRA~1SQLLIBjavaruntime.zip;C:PROGRA~1SQLLIBjavasqlj.zip;C:PROGRA~1SQLLIBbinMqzitug
set MDIS_PROFILE=C:PROGRA~1SQLLIBMETADATAPROFILESMqzitug
set LC_ALL=ZH_CNMqzitug
set INCLUDE=C:PROGRA~1SQLLIBINCLUDE;C:PROGRA~1SQLLIBLIB;C:PROGRA~1SQLLIBTEMPLATESINCLUDEMqzitug
set LIB=C:PROGRA~1SQLLIBLIBMqzitug
set DB2PATH=C:PROGRA~1SQLLIBMqzitug
set DB2TEMPDIR=C:PROGRA~1SQLLIBMqzitug
set VWS_TEMPLATES=C:PROGRA~1SQLLIBTEMPLATESMqzitug
set VWS_LOGGING=C:PROGRA~1SQLLIBLOGGINGMqzitug
set VWSPATH=C:PROGRA~1SQLLIBMqzitug
set VWS_FOLDER=IBM DB2Mqzitug
set ICM_FOLDER=信息目录管理器Mqzitug
Mqzitug
winMqzitug
Mqzitug
Mqzitug
4.2        创建DatabaseMqzitug
create database head using codeset IBM-eucCN territory CN;Mqzitug
这样可以支持中文。Mqzitug
Mqzitug
Mqzitug
4.3        手工做数据库远程(别名)配置Mqzitug
db2  catalog tcpip  node   node1  remote   172.28.200.200 server  50000Mqzitug
db2  catalog db    head   as     test1                at  node   node1Mqzitug
Mqzitug
然后既可使用:Mqzitug
   db2 connect to test1  user …  using …Mqzitug
连上head库了Mqzitug
Mqzitug
4.4        停止启动数据库实例Mqzitug
db2startMqzitug
db2stop (force)Mqzitug
Mqzitug
Mqzitug
4.5        连接数据库及看当前连接数据库Mqzitug
连接数据库Mqzitug
db2  connect to head user db2inst1  using db2inst1Mqzitug
Mqzitug
当前连接数据库Mqzitug
db2  connectMqzitug
4.6        停止启动数据库headMqzitug
db2  activate  db  headMqzitug
db2  deactivate db  headMqzitug
要注意的是,如果有连接,使用deactivate db 不起作用。Mqzitug
如果是用activate db启动的数据库,一定要用deactivate db才会停止该数据库。(当然如果是db2stop也会停止)。Mqzitug
使用activate db,这样可以减少第一次连接时的等待时间。Mqzitug
Database如果不是使用activate db启动而是通过连接数据库而启动的话,当所有的连接都退出后,db也就自动停止。Mqzitug
Mqzitug
4.7        查看及停止数据库当前的应用程序Mqzitug
查看应用程序:Mqzitug
db2   list          applications         show  detail Mqzitug
        Mqzitug
授权标识 | 应用程序名 | 应用程序句柄 |  应用程序标识 | 序号#  | 代理程序 |  协调程序 | 状态 |  状态更改时间 |  DB 名 | DB 路径|                                                      |    节点号 |   pid/线程Mqzitug
Mqzitug
        其中:1、应用程序标识的第一部分是应用程序的IP地址,不过是已16进制表示的。Mqzitug
                2、pid/线程即是在unix下看到的线程号。Mqzitug
Mqzitug
停止应用程序:Mqzitug
db2 "force application(236)"Mqzitug
db2 “force application all”Mqzitug
Mqzitug
其中:该236是查看中的应用程序句柄。Mqzitug
Mqzitug
Mqzitug
4.8        查看本instance下有哪些databaseMqzitug
db2 LIST DATABASE DIRECTORY  [ on /home/db2inst1 ]Mqzitug
4.9        查看及更改数据库head的配置Mqzitug
请注意,在大多数情况下,更改了数据的配置后,只有在所有的连接全部断掉后才会生效。Mqzitug
Mqzitug
查看数据库head的配制Mqzitug
db2 get db cfg for headMqzitug
Mqzitug
Mqzitug
更改数据库head的某个设置的值Mqzitug
4.9.1        改排序堆的大小Mqzitug
                                db2 update db cfg for head using SORTHEAP 2048Mqzitug
        将排序堆的大小改为2048个页面,查询比较多的应用最好将该值设置比较大一些。Mqzitug
4.9.2        改事物日志的大小Mqzitug
                        db2 update db cfg for head using  logfilsiz  40000Mqzitug
                        该项内容的大小要和数据库的事物处理相适应,如果事物比较大,应该要将该值改大一点。否则很容易处理日志文件满的错误。Mqzitug
Mqzitug
4.9.3        出现程序堆内存不足时修改程序堆内存大小Mqzitug
                        db2 update db cfg for head using  applheapsz  40000Mqzitug
                        该值不能太小,否则会没有足够的内存来运行应用程序。Mqzitug
Mqzitug
4.10        查看及更改数据库实例的配置Mqzitug
查看数据库实例配置Mqzitug
db2  get dbm cfg Mqzitug
更改数据库实例配制Mqzitug
Mqzitug
4.10.1        打开对锁定情况的监控。Mqzitug
                                db2 update dbm cfg using dft_mon_lock  onMqzitug
4.10.2        更改诊断错误捕捉级别Mqzitug
                        db2 update dbm cfg using diaglevel                3Mqzitug
                                        0 为不记录信息Mqzitug
                                        1 为仅记录错误Mqzitug
                                        2 记录服务和非服务错误Mqzitug
缺省是3,记录db2的错误和警告Mqzitug
                                        4 是记录全部信息,包括成功执行的信息Mqzitug
                        一般情况下,请不要用4,会造成db2的运行速度非常慢。Mqzitug
                                Mqzitug
4.11        db2环境变量Mqzitug
db2 重装后用如下方式设置db2的环境变量,以保证sp可编译Mqzitug
将set_cpl 放到AIX上, chmod +x set_cpl, 再运行之Mqzitug
Mqzitug
set_cpl的内容Mqzitug
db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r  -g Mqzitug
-I$HOME/sqllib/include SQLROUTINE_FILENAME.c Mqzitug
-bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY Mqzitug
-o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2"Mqzitug
Mqzitug
db2set DB2_SQLROUTINE_KEEP_FILES=1Mqzitug
4.12        db2命令环境设置Mqzitug
        db2=>;list command optionsMqzitug
        db2=>;update command options using C off--或on,只是临时改变Mqzitug
        db2=>;db2set db2options=+c --或-c,永久改变Mqzitug
Mqzitug
4.13        改变隔离级别Mqzitug
DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|URMqzitug
        Mqzitug
交互环境更改session的隔离级别,Mqzitug
       db2 change isolation  to URMqzitug
                请注意只有没有连接数据库时可以这样来改变隔离级别。Mqzitug
Mqzitug
4.14        管理dbinstance的参数Mqzitug
get db cfg for head(db)Mqzitug
get dbm cfg(instance)Mqzitug
Mqzitug
4.15        升级后消除版本问题Mqzitug
db2   bind  @db2ubind.lstMqzitug
db2   bind   @db2cli.lstMqzitug
Mqzitug
4.16        查看数据库表的死锁Mqzitug
再用命令中心查询数据时要注意,如果用了交互式查询数据,命令中心将会给所查的记录加了s锁.这时如果要update记录,由于update要使用x锁,排它锁,将会处于锁等待.Mqzitug
Mqzitug
首先,将监视开关打开Mqzitug
db2 update dbm cfg using dft_mon_lock  onMqzitug
快照Mqzitug
  db2 get snapshot for  Locks  on  cleardb   >;snap.logMqzitug
                    tables Mqzitug
                                                bufferpoolsMqzitug
                                                tablespacesMqzitug
                                                databaseMqzitug
   然后再看snap.log中的内容即可。Mqzitug
对Lock可根据Application handle(应用程序句柄)看每个应用程序的锁的情况。Mqzitug
监视完毕后,不要忘了将监视器关闭Mqzitug
     db2 update dbm cfg using dft_mon_lock  off

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多