db2开发参考

更新时间:2023-12-13 06:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、 体系架构

1、 DB2 UDB 体系结构

DB2 UDB 内存结构

? ? ?

包缓存 —— 为存储静态和动态 SQL 语句而分配的内存。

缓冲池 —— 在将数据刷新到磁盘之前,为存储数据而分配的内存。

日志缓冲区 —— 在将所有对数据库的更改刷新到磁盘上的日志之前,用来存储这些更改的内存。

2、 DB2 UDB 数据库结构

? ? ? ? ? ? ? ?

驱动器/目录 —— 在 CREATE DATABASE 命令中指定的驱动器或目录。 DB2 实例名称 —— DB2 实例所有者的名称。

NODE0000 —— 数据库的分区数。0 表示非分区的数据库。 SQL00001 —— 从 1 开始的数据库 ID。 SQLOGDIR —— 数据库的默认日志目录。 SQLT0000.0 —— 目录表空间 SYSCATSPACE。 SQLT0001.0 —— 临时表空间 TEMPSPACE1。 SQLT0002.0 —— 用户表空间 USERSPACE1

3、 DB2 UDB内存架构和后台进程

DB2 实例可以包含多个数据库,因此存在两个级别的配置。实例级的配置可以在 DBM CFG 文件中完成,而数据库级的配置则可以在 DB CFG 文件中完成。这两个级别上的配置参数都可以进行调整,以调优内存使用情况。

DB2 中主要有三种内存结构:

? ? ?

实例共享内存:这是数据库管理器全局共享内存,是在使用 db2start 命令启动实例时分配给实例的,并且在发出 db2stop 命令停止实例之前,一直处于已分配状态。

数据库共享内存:这是数据库全局内存,是在激活数据库或者第一次连接到数据库时分配的。分配的内存包括缓冲池、锁列表、数据库堆、实用程序堆、包缓存和编目缓存。

应用程序共享内存:这是在应用程序连接到一个数据库时分配的内存,由处理连接到数据库的客户机所请求的工作的代理使用。每个连接到数据库的应用程序都会被分配内存;因此,对会影响应用程序共享内存的参数的正确配置就非常重要。

在 DB2 for Windows 中,服务器活动是以线程的形式进行的,而在 Linux 和 UNIX 环境中,这些活动是以后台进程的形式来实现的。DB2 有以下几种级别的进程:

? 实例级:这些进程是在实例启动时初始化的:

1. DB2 Daemon Spawner(db2gds):全局守护处理程序,每个实例都对应一个这样的进程

(仅在 UNIX 中)

2. DB2 System Controller(db2sysc):DB2 主进程。 3. DB2 Watchdog(db2wdog):所有其他进程的父进程。

4. DB2 Format Log(db2fmtlg):类似于 Oracle 中的 ARCn 进程,为日志路径中的日志

文件预先分配空间。

? 数据库级:这些进程是在建立到数据库的连接时初始化的:

1. DB2 Log Reader(db2loggr):类似于 Oracle 的 PMON 进程的一个子集。该进程在回

滚、重启恢复和前滚期间读取日志文件。

2. DB2 Log Writer(db2logw):将日志从日志缓冲区刷新到磁盘上的事务日志文件中。相

当于 Oracle 中的 LGWR 进程。

3. DB2 Page Cleaner(db2pclnr):相当于 Oracle 中的 DBWR 进程,该进程在将页从磁

盘上转移到 BP 中之前,清理缓冲池。

4. DB2 Prefetcher(db2pfchr):将需要用到的页预先从磁盘取出到缓冲池中。 5. DB2 Deadlock Detector(db2dlock):死锁检测器进程。

? 应用程序级:每个连接到数据库的应用程序,都具有属于它自己的应用程序级后台进程与之相关联。这些进程有:

1. DB2 Communication Manager(db2ipccm):进程间通信进程,用于每个本地连接的客户

机。

2. DB2 TCP Manager(db2tcpcm):TCP 通信管理器进程,用于使用 TCP/IP 连接数据库的

远程客户机。

3. DB2 Coordinating Agent(db2agent):代表应用程序处理所有请求的进程。 4. DB2 Subagent(db2agnta):空闲子代理。

5. Active Subagent(db2agntp):在启用了 SMP 并行的情况下使用的活动子代理,它使

一个任务可以使用多个进程。

4、 DB2 UDB工作原理

二、 编目

1、 节点(主机)

a) 列出节点

db2 list node directory

b) 编目远程结点

---节点名作为编目到本地的实例名称

db2 catalog tcpip node EAST remote 9.181.138.233 server 50000 c) 编目本地节点,当本地数据库出现多于一个实例时,其余的实例都会在

本地进行编目结点

db2 CATALOG LOCAL NODE test INSTANCE test SYSTEM TOP-GONGSHANG OSTYPE NT d) 删除节点

db2 uncatalog node test

2、 实例

a) 建立数据库实例

db2icrt

b) 列出所有的数据库实例

db2ilist

c) 得到当前的数据库实例

db2 get instance

d) 删除数据库实例

db2idrop

3、 数据库 a) 系统数据库目录

---列出系统数据库目录,系统数据库目录与具体的环境变量(db2instance)无关.

db2 list db directory

b) 本地数据库目录

---列出本地数据库目录,本地数据库目录与具体的环境变量(db2instance)有关.

db2 list db directory on d:

c) 在系统数据库目录中编目数据库

db2 catalog database ISOURCE at node EAST

d) 删除系统数据库编目

db2 uncatalog database topicis

e) 删除本地数据库编目

db2 drop database test1

4、 数据库的完整性

a) 在系统数据库目录中对本地数据库进行编目

只有在系统数据库目中对本地数据库进行了编目才能把数据库挂载到实例上,才能对数据库执行删除的操作。

b) 数据库和实例的交叉对应关系

在对数据库进行了系统编目后就可以挂载到实例上(远程节点

除外),挂载的实例可以和数据库创建时所在的实例不同。

三、 常用命令

1、 建立数据库DB2_GCB

CREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCB USING CODESET GBK

TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32

2、 建立SAMPLE数据库

DB2SAMPL

DB2SAMPL F:(指定安装盘)

3、 建立工具目录数据库

DB2 CREATE TOOLS CATALOG CC CREATE NEW DATABASE TOOLSDB

4、 连接数据库

CONNECT TO SAMPLE1 USER DB2ADMIN USING 8301206 NEW DB2ADMIN CONFIRM DB2ADMIN

5、 插入记录,修改记录,删除记录

INSERT INTO ZJT_TABLES SELECT * FROM TABLES INSERT INTO ZJT_VIEWS SELECT * FROM VIEWS

INSERT INTO TEST(ID,PHONE) VALUES(1,’5’) UPDATE TEST SET PHONE=’65356675’ WHERE ID=1 DELETE FROM TEST WHERE ID=1

6、 建立用户、建立表别名

CREATE ALIAS DB2ADMIN.TABLES FOR SYSSTAT.TABLES CREATE ALIAS DB2ADMIN.VIEWS FOR SYSCAT.VIEWS

CREATE ALIAS DB2ADMIN.COLUMNS FOR SYSCAT.COLUMNS CREATE ALIAS GUEST.COLUMNS FOR SYSCAT.COLUMNS

GRANT DBADM,CREATETAB,BINDADD,CONNECT,CREATE_NOT_FENCED_ ROUTINE ON DATABASE TO USER GUEST

GRANT CREATEIN,DROPIN,ALTERIN ON SCHEMA DB2ADMIN TO USER GUEST WITH GRANT OPTION

7、 建立、更改、删除表结构

CREATE TABLE table_name(

column1 DATATYPE [NOT NULL] [NOT NULL PRIMARY KEY], column2 DATATYPE [NOT NULL], ...)

CREATE TABLE ZJT_TABLES AS

(SELECT * FROM TABLES) DEFINITION ONLY CREATE TABLE ZJT_VIEWS AS

(SELECT * FROM VIEWS) DEFINITION ONLY

ALTER TABLE table_name ADD COLUMN column_name DATATYPE ALTER TABLE table_name ADD PRIMARY KEY (column_name) ALTER TABLE table_name DROP PRIMARY KEY (column_name)

DROP table table_name

ALTER TABLE TABLE_NAME1 ADD CONSTRAINT CONSTRAINT_NAME

FOREIGN KEY (COLUMN1, COLUMN2, COLUMN3) REFERENCES TABLE_NAME2 (COLUMN4, COLUMN5,COLUMN6) ON DELETE RESTRICT

8、 建立触发器

CREATE TRIGGER \ NO CASCADE BEFORE DELETE ON \

TAFF\

REFERENCING OLD AS OLDSTAFF FOR EACH ROW MODE DB2SQL WHEN(OLDSTAFF.JOB = 'SALES') BEGIN

ATOMIC SIGNAL SQLSTATE '75000' ('SALES STAFF CANNOT BE DELETED... SEE THE DO_NOT_DEL_SALES TRIGGER.'); END;

9、 建立索引

A、 一般索引

CONNECT TO SAMPLE

CREATE INDEX DB2ADMIN.IDX_STAFF_NAME ON STAFF (\ASC) PCTFREE 10 MINPCTUSED 10 COLLECT STATISTICS CONNECT RESET

B、 唯一索引

CONNECT TO SAMPLE

CREATE UNIQUE INDEX DB2ADMIN.UIDX_STAFF_ID ON STAFF (ID ASC) PCTFREE 10 MINPCTUSED 10 COLLECT STATISTICS CONNECT RESET

C、 双向索引

CONNECT TO SAMPLE

CREATE INDEX DB2ADMIN.BIDX_STAFF_SALARY ON STAFF (SALARY ASC) PCTFREE 10 MINPCTUSED 10 ALLOW REVERSE SCANS COLLECT DETAILED STATISTICS CONNECT RESET

D、 簇索引

CONNECT TO SAMPLE;

CREATE INDEX DB2ADMIN.CIDX_STAFF_DEPT ON STAFF (DEPT ASC) CLUSTER PCTFREE 10 MINPCTUSED 10 COLLECT SAMPLED DETAILED STATISTICS

CONNECT RESET

10、 建立全局临时表

A、创建用户临时表空间

CONNECT TO SAMPLE

CREATE USER TEMPORARY TABLESPACE USER_TEMP PAGESIZE 4 K MANAGED BY SYSTEM USING ('D:\\DB2\\NODE0000\\SAMPLE\\USER_TEMP' ) EXTENTSIZE 16 OVERHEAD 10.5 PREFETCHSIZE 16 TRANSFERRATE 0.14 BUFFERPOOL IBMDEFAULTBP CONNECT RESET

B、创建全局临时表

DB2 DECLARE GLOBAL TEMPORARY TABLE TEMPLOYEE LIKE EMPLOYEE NOT LOGGED

C、查看创建过的临时表

SELECT * FROM SESSION.TEMPLOYEE

需要取消事务的自动落实(UPDATE COMMAND OPTIONS USING C OFF) FOR EXAMPLE:

DB2>CONNECT TO SAMPLE DB2>LIST COMMAND OPTIONS

DB2>UPDATE COMMAND OPTIONS USING C OFF DB2>LIST COMMAND OPTIONS

DB2>DECLARE GLOBAL TEMPORARY TABLE TSTAFF LIKE STAFF NOT LOGGED DB2>INSERT INTO SESSION.TSTAFF SELECT * FROM STAFF DB2>SELECT * FROM SESSION.STAFF DB2>COMMIT

DB2>SELECT * FROM STAFF DB2>CONNECT RESET

11、 建立模式名

CREATE SCHEMA SCHEMA_NAME AUTHORIZATION AUTH_NAME

12、 建立视图

CREATE VIEW VIEW_NAME (COLUMN_NAMES) AS FULLSELECT WITH {LOCAL|CASCADED} CHECK OPTION FOR EXAMPLE:

CREATE VIEW NEW.V3 AS SELECT * FROM SALES AS SALES

CREATE VIEW NEW.V4 AS SELECT * FROM SALES AS SALES WITH CASCADED CHECK OPTION

CREATE VIEW NEW.V5 AS SELECT * FROM SALES AS SALES WITH LOCAL CHECK OPTION

13、 建立序列

CREATE SEQUENCE ORG_SEQ START WITH 1 INCREMENT BY 1 NO MAXVALUE NO CYCLE CACHE 24

--GET SEQUENCE

VALUES NEXTVAL FOR ORG_SEQ

14、 建立表空间

CREATE [{REGULAR | LARGE | SYSTEM TEMPORARY | USER TEMPORARY}] TABLESPACE table_space_name [PAGESIZE integer [K]]

MANAGED BY {SYSTEM | DATABASE} USING (container_definition_string) [BUFFERPOOL buffpool_name]

15、 查看系统表视图

SELECT * FROM SYSCAT.TABLES

16、 查看列

SELECT SUBSTR(COLNAME,1,20) AS \列名\AS 类型,LENGTH AS 长度 FROM SYSCAT.COLUMNS WHERE TABNAME='STAFF'

17、 查看表结构

DB2 DESCRIBE TABLE USER1.DEPARTMENT DB2 DESCRIBE SELECT * FROM USER.TABLES

18、 查看当前用户所有表和视图

LIST TABLES

19、 查看表的索引

DB2 DESCRIBE INDEXES FOR TABLE USER1.DEPARTMENT

20、 查看视图

SELECT VIEWNAME FROM VIEWS WHERE VIEWNAME='V_ZJT'

21、 查看索引

SELECT INDNAME FROM SYSCAT.INDEXES WHERE INDNAME='I_ZTABLES'

22、 查看存贮过程

SELECT SUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15) FROM SYSCAT.PROCEDURES

23、 列出所有的系统表和视图

LIST TABLES FOR SYSTEM

24、 列出当前连接的数据库

LIST ACTIVE DATABASES

25、 列出并设置命令选项

LIST COMMAND OPTIONS

UPDATE COMMAND OPTIONS USING C OFF

26、 列出系统数据库目录

LIST DATABASE DIRECTORY

27、 列出表空间

LIST TABLESPACES

28、 列出表空间容器

LIST TABLESPACE CONTAINERS FOR 1

29、 列出连接

LIST APPLICATION

30、 重新连接

CONNECT RESET

31、 中断数据库连接

DISCONNECT DB2_GCB

32、 杀掉连接

FORCE APPLICATION(0)

DB2 FORCE APPLICATIONS ALL (强迫所有应用程序从数据库断开)

33、 锁定表

LOCK TABLE TEST IN EXCLUSIVE MODE

34、 共享表

LOCK TABLE TEST IN SHARE MODE

35、 启动实例

DB2START

36、 停止实例

DB2STOP

37、 取得当前用户的存取权限

GET AUTHORIZATIONS

38、 表或视图特权

GRANT SELECT,DELETE,INSERT,UPDATE ON TABLES TO USER GRANT ALL ON TABLES TO USER WITH GRANT OPTION

39、 程序包特权

GRANT EXECUTE ON PACKAGE SQLE0F00 TO PUBLIC

40、 模式特权

GRANT CREATEIN ON SCHEMA SCHEMA-NAME TO USER

41、 数据库特权

GRANT CONNECT,CREATETAB,DBADM ON DATABASE TO USER

42、 索引特权

GRANT CONTROL ON INDEX INDEX-NAME TO USER

43、 信息帮助 (? XXXnnnnn )

例:? SQL30081

44、 SQL 帮助(说明 SQL 语句的语法)

? STATEMENT 例如,? CONNECT

45、 SQLSTATE 帮助(说明 SQL 的状态和类别代码)

? SQLSTATE 或 ? CLASS-CODE

46、 更改与\管理服务器\相关的口令

DB2ADMIN SETID USERNAME PASSWORD

47、 使用操作系统命令

! DIR

48、 转换数据类型 (cast)

SELECT EMPNO, CAST(RESUME AS VARCHAR(370)) FROM EMP_RESUME WHERE RESUME_FORMAT = 'ascii'

49、 UDF

要运行 DB2 Java 存储过程或 UDF,还需要更新服务器上的 DB2 数据库管理 程序配置,以包括在该机器上安装 JDK 的路径

DB2 UPDATE DBM CFG USING JDK_PATH D:\\IBM\\SQLLIB\\JAVA\\JDK

TERMINATE

UPDATE DBM CFG USING SPM_NAME SAMPLE

50、 检索具有特权的所有授权名

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'DATABASE' FROM SYSCAT.DBAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'TABLE ' FROM SYSCAT.TABAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'PACKAGE ' FROM SYSCAT.PACKAGEAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'INDEX ' FROM SYSCAT.INDEXAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'COLUMN ' FROM SYSCAT.COLAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SCHEMA ' FROM SYSCAT.SCHEMAAUTH UNION

SELECT DISTINCT GRANTEE, GRANTEETYPE, 'SERVER ' FROM SYSCAT.PASSTHRUAUTH

ORDER BY GRANTEE, GRANTEETYPE, 3

51、 事务的提交、回滚

COMMIT ROLLBACK

52、 查看db2的许可证信息

DB2LICM -L

53、 显示实例名称

DB2ILIST

54、 更新实例

DB2IUPDT INSTANCE_NAME

55、 取得DAS实例的配置信息

DB2 GET ADMIN CFG

56、 取得其他实例的配置信息

DB2 GET DBM CFG或者 DB2 GET DATABASE MANAGER CONFIGURATION

57、 取得数据库的配置信息

DB2 GET DATABASE CONFIGURATION FOR DATABASE_NAME

58、 数据库备份

CONNECT TO TAIS

QUIESCE DATABASE IMMEDIATE FORCE CONNECTIONS CONNECT RESET

BACKUP DATABASE TAIS TO \PARALLELISM 1 WITHOUT PROMPTING CONNECT TO TAIS UNQUIESCE DATABASE

59、 数据库恢复

DB2 RESTORE DATABASE TAIS FROM D:\\BACKUP TAKEN AT 20061017 WITHOUT ROLLING FORWARD

60、 切换实例(windows)

SET DB2INSTANCE=TAIS

61、 取得当前时间

VALUES CURRENT TIMESTAMP

62、 使用约束

A、Use this command to create a new table called po_master CREATE TABLE PO_MASTER ( PO_NO INTEGER NOT NULL, PO_DATE DATE NOT NULL, BILL_NO INTEGER NOT NULL, BILL_DATE DATE NOT NULL, DESCRIPTION VARCHAR (200),

CONSTRAINT PK_PO_MASTER PRIMARY KEY (PO_NO), CONSTRAINT U_KEY_BILL_NO UNIQUE (BILL_NO))

B、Use the following command to alter an existing table called po_master

ALTER TABLE PO_MASTER ADD CONSTRAINT U_KEY_BILL_NO UNIQUE (BILL_NO)

C、Using the CLP, create a table called po_master with a primary key on po_no using the following command CREATE TABLE PO_DETAIL ( PO_NO INTEGER NOT NULL, S_NO INTEGER NOT NULL,

ITEM_CODE INTEGER NOT NULL, DESCRIPTION VARCHAR (100), QUANTITY INTEGER NOT NULL, RATE INTEGER NOT NULL, PRIMARY KEY (PO_NO, S_NO),

CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY(PO_NO)

REFERENCES ADMINISTRATOR.PO_MASTER (PO_NO))

D、There are four CREATE TABLE options for defining the delete rule: NO ACTION,RESTRICT :If RESTRICT or NO ACTION is selected, an error occurs and no records are deleted if you try to delete records from parent table.

CASCADE: If CASCADE is selected, the delete operation is propagated to the dependent tables, that is, records in the po_master table as well as all the related records in the po_detail table are automatically deleted.

SET NULL: If SET NULL is selected, the delete operation in po_master table is allowed and the the related records in po_detail table are set to NULL.

E、modify table

---add restrict constraint(delete) CONNECT TO SAMPLE ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE RESTRICT ON UPDATE NO ACTION ENFORCED ENABLE QUERY OPTIMIZATION CONNECT RESET

---add no action constraint(delete) CONNECT TO SAMPLE ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE NO ACTION ON UPDATE NO ACTION ENFORCED ENABLE QUERY OPTIMIZATION CONNECT RESET

---add cascade constraint(delete) CONNECT TO SAMPLE; ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE CASCADE ON UPDATE NO ACTION ENFORCED ENABLE QUERY OPTIMIZATION ; CONNECT RESET;

---add set null constraint(delete) CONNECT TO SAMPLE; ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE SET NULL ON

UPDATE NO ACTION ENFORCED ENABLE QUERY OPTIMIZATION ; CONNECT RESET;

---add restrict constraint(update) CONNECT TO SAMPLE;

ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE RESTRICT ON UPDATE RESTRICT ENFORCED ENABLE QUERY OPTIMIZATION ; CONNECT RESET;

---add no action constraint(update) CONNECT TO SAMPLE;

ALTER TABLE DB2ADMIN.PO_DETAIL DROP FOREIGN KEY

FK_PO_MASTERDETAIL ADD CONSTRAINT FK_PO_MASTERDETAIL FOREIGN KEY (PO_NO) REFERENCES DB2ADMIN.PO_MASTER (PO_NO) ON DELETE RESTRICT ON UPDATE NO ACTION ENFORCED ENABLE QUERY OPTIMIZATION ; CONNECT RESET;

F、Using Check Constraints

ALTER TABLE po_master ADD CONSTRAINT chk_bill_date CHECK (bill_date <= po_date)

63、 导入导出数据

DB2 supports the following data formats for extraction and insertion: ◆ Delimited ASCII format (DEL) ◆ Integrated exchange format (IXF) ◆ Worksheet format (WSF) ◆ Non-delimited ASCII (ASC)

CONNECT TO SAMPLE;

EXPORT TO \无界定字符\无界定字符.log\SELECT * FROM NEW.EMPLOYEE; CONNECT RESET;

CONNECT TO SAMPLE;

EXPORT TO \界定字符\界定字符.log\SELECT * FROM NEW.EMPLOYEE; CONNECT RESET;

CONNECT TO SAMPLE;

EXPORT TO \工作表格式\工 作表格式.log\SELECT * FROM NEW.EMPLOYEE;

CONNECT RESET;

CONNECT TO SAMPLE;

EXPORT TO \集成交换格式\集成交换格式.log\SELECT * FROM NEW.EMPLOYEE; CONNECT RESET;

CONNECT TO SAMPLE;

IMPORT FROM \界定字符\9, 10, 11, 12, 13, 14) MESSAGES \界定字符.log\INSERT INTO DB2ADMIN.EMPLOYEE_DUP (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM);

CONNECT RESET;

CONNECT TO SAMPLE;

IMPORT FROM \工作表格式\工作表格式.log\INSERT INTO DB2ADMIN.EMPLOYEE_DUP; CONNECT RESET;

CONNECT TO SAMPLE;

IMPORT FROM \集成交换格式\集成交换格式.log\INSERT INTO DB2ADMIN.EMPLOYEE_DUP; CONNECT RESET;

64、 装载数据

DB2 \

DB2 \

DB2 \ DB2 \ DB2 \ DB2 \TABLE EMPLOYEE_DUP ADD CONSTRAINT CHK_CNST CHECK(EDLEVEL > 12)\

CONNECT TO SAMPLE;

LOAD FROM \界定字符\10, 11, 12, 13, 14) MESSAGES \界定字符.LOG\INSERT INTO DB2ADMIN.EMPLOYEE_DUP (EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT, PHONENO, HIREDATE, JOB, EDLEVEL, SEX, BIRTHDATE, SALARY, BONUS, COMM) COPY NO INDEXING MODE AUTOSELECT; CONNECT RESET;

65、 生成DDL语句

---SINGLE SCHEMA

DB2LOOK -D SAMPLE -Z NEW -U DB2ADMIN -E -L -X -M -R ;

---FULL DATABASE

DB2LOOK -D SAMPLE -A -E -L -X -M -R -F ;

66、 锁和并发控制

DB2 PROVIDES DIFFERENT LEVELS OF PROTECTION TO ISOLATE DATA: ◆ UNCOMMITTED READ ◆ CURSOR STABILITY ◆ READ STABILITY ◆ REPEATABLE READ

---DEFAULT ISOLATION LEVEL CURSOR STABILITY

EXERCISE(USING UR ISOLATION):

1.1 OPEN TWO COMMAND LINE PROCESSOR WINDOWS. WE WILL REFER TO THESE WINDOWS

AS W1 AND W2. MAKE SURE THEY CONNECT TO THE CORRECT INSTANCE BEFORE MOVING TO THE NEXT STEP.

1.2 SET THE AUTOCOMMIT FEATURE OFF IN BOTH W1 AND W2 BY EXECUTING THIS COMMAND:

DB2 => UPDATE COMMAND OPTIONS USING C OFF

1.3 CHANGE ISOLATION LEVEL OF W1 TO UNCOMMITTED READ. DB2 => CHANGE ISOLATION TO UR DB2 => CONNECT TO SAMPLE 1.4 NOW GO TO W2 WHERE THE DEFAULT ISOLATION IS CURSOR STABILITY. RUN THESE COMMANDS:

DB2 => CONNECT TO SAMPLE

DB2 => UPDATE STAFF SET SALARY = SALARY + 10

1.5 GO BACK TO W1 AND RUN THE FOLLOWING STATEMENT TO VIEW DIRTY RECORDS FROM THE STAFF TABLE.

DB2 => SELECT * FROM STAFF

YOU WILL SEE UPDATED, BUT NOT COMMITTED DATA IN W2. THIS IS KNOWN AS A DIRTY READ.

1.6 AGAIN SWITCH TO W2 AND ROLL BACK THE TRANSACTION. DB2 => ROLLBACK

1.7 NOW, YOU CAN GET ACTUAL DATA IN W1: DB2 => SELECT * FROM STAFF

1.8 CLOSE BOTH WINDOWS W1 AND W2.

EXERCISE(LOCKING A DATABASE)

THE SYNTAX FOR THE CONNECT COMMAND IS SHOWN HERE: CONNECT TO DATABASE_NAME [IN EXCLUSIVE MODE]

EXECUTE THE FOLLOWING COMMAND:

DB2 CONNECT TO SAMPLE IN EXCLUSIVE MODE USER YOUR_LOGIN USING YOUR_PASSWORD

NOW, TRY TO CONNECT TO SAMPLE DATABASE AS ANY USER OTHER THAN YOUR_LOGIN. THE FOLLOWING

MESSAGE IS RETURNED:

DB2 CONNECT TO SAMPLE USER TEST USING TEST

SQL1035N THE DATABASE IS CURRENTLY IN USE. SQLSTATE=57019

67、 警告级别设置

实例参数:DIAGLEVEL=3

日志文件:D:\\IBM\\SQLLIB\\DB2

68、 查看并设置注册变量

USE THE DB2SET COMMAND TO VIEW REGISTRY VARIABLE VALUES: ?DB2SET -I FOR INSTANCE-LEVEL PARAMETERS ?DB2SET -G FOR GLOBAL-LEVEL PARAMETERS ?DB2SET -I FOR ALL THE DEFINED PROFILES

?DB2SET -ALL FOR ALL THE REGISTRY VARIABLES WITH VALUES ?DB2SET -LR FOR ALL AVAILABLE PARAMETERS

TO SET A PARAMETER FOR THE CURRENT INSTANCE: ?SYNTAX: DB2SET PARAMETER=VALUE

?EXAMPLE: DB2SET DB2COMM=TCPIP,NPIPE

TO SET A PARAMETER’S VALUE FOR A SPECIFIC INSTANCE: ?SYNTAX: DB2SET PARAMETER=VALUE -I INSTANCE_NAME ?EXAMPLE: DB2SET DB2COMM=TCPIP,NPIPE -I ALTINST

TO SET A PARAMETER AT THE GLOBAL LEVEL: ?SYNTAX: DB2SET PARAMETER=VALUE -G

?EXAMPLE: DB2SET DB2COMM=TCPIP,NPIPE -G

69、 编目服务器

SYNTAX FOR CATALOGING A SERVER:

CATALOG TCPIP NODE NODE_NAME REMOTE {HOSTNAME | IP_ADDRESS} SERVER {SVCENAME | PORT_NUMBER}

EXAMPLE:

CATALOG TCPIP NODE DB2SERV REMOTE 9.186.128.141 SERVER 3700

db2 catalog tcpip node EAST remote 9.181.138.233 server 50000 db2 catalog database ISOURCE at node EAST db2 terminate

―――编目本地实例,当数据库出现多于一个实例时,其余的实例都会在本地进行编目结点 CATALOG LOCAL NODE test INSTANCE test SYSTEM TOP-GONGSHANG OSTYPE NT;

70、 刷新目录高速缓存

db2 terminate

71、 编目数据库

SYNTAX FOR CATALOGING A DATABASE:

CATALOG DATABASE DB_NAME AS DB_ALIAS AT NODE NODE_NAME

EXAMPLE:

CATALOG DATABASE SAMPLE AS SRV_SAMP AT NODE DB2SERVER

72、 输出重新定向到文件中

可以使用 -R 或 -Z CLP 选项将输出重定向到文件中(参见表 1)。例如: DB2 -R MYDATA\\ORGLIST.TXT \

73、 特殊字符在unix或者linux下的用法

建议在基于 LINUX 和 UNIX 的系统中使用双引号分隔符。如果在 CLP 命令模式下使用了特殊字符,那么这些特殊符号将由操作系统 SHELL 解释。这可能会生成意想不到的结果,除非使用双引号或换码符(如反斜线字符 \\)。例如,在 AIX? KORN SHELL 环境中执行下列命令时,如下所示:

DB2 SELECT * FROM EMPLOYEE WHERE EDLEVEL > 18

该命令被解释为“选择 EMPLOYEE 表中所有 EDLEVEL 大于 18 的记录,并将输出重定向到名为‘18’的文件”。下列命令将返回正确的输出:

DB2 \

或者

DB2 SELECT \\* FROM EMPLOYEE WHERE EDLEVEL \\> 18

74、 CLP 将“NULL”(以大写字符指定)识别为空字符串

DB2 UPDATE DATABASE CONFIGURATION USING MIRRORLOGPATH NULL

75、 查看缓存命令

HISTORY

76、 编辑缓存命令

EDIT OR E 3

77、 重新执行缓存命令

RUNCMD OR R 3

78、 选择编辑器

DB2SET DB2_CLP_EDITOR=\

79、 执行批处理SQL

---定制分隔符#

DB2 -TD# -F D:\\WII文档\\省局数据复制的建立\\4_CAPNICKNAME18ZHOUKOU.SQL -L C:\\WIILOG\\4_CAPNICKNAME18ZHOUKOU.LOG

---默认分隔符为;

DB2 -TVF D:\\WII文档\\省局数据复制的建立\\6_SETSHANGQIU.SQL -L C:\\WIILOG\\6_SETSHANGQIU.LOG

---DOS下执行,默认分隔符为;

---(-C:执行DB2命令窗口,然后停止;-W:一直等到DB2命令窗口终止; -I:从进行调用的SHELL继承环境;-T:从进行调用的SHELL继承标题) DB2CMD -C -W -I -T DB2 -TVF D:\\WII文档\\省局数据复制的建立\\6_SETSHANGQIU.SQL -L C:\\WIILOG\\6_SETSHANGQIU.LOG

80、 DB2端口号

C:\\WINDOWS\\SYSTEM32\\DRIVERS\\ETC\\SERVICES文件

下面几个是在安装是选择了PARTITION才有的,一共有两个实例 实例一:DB2C_DB2 DB2_DB2 60000/TCP DB2_DB2_1 60001/TCP DB2_DB2_2 60002/TCP DB2_DB2_END 60003/TCP 实例二:DB2C_DB2CTLSV DB2_DB2CTLSV 60004/TCP DB2_DB2CTLSV_1 60005/TCP DB2_DB2CTLSV_2 60006/TCP DB2_DB2CTLSV_END 60007/TCP

下面才是真正用于应用程序和编目数据库的端口号 DB2C_DB2 50000/TCP DB2C_DB2CTLSV 50001/TCP

四、 目录视图说明

说明 目录视图 检查约束 列 检查约束引用的列 关键字中使用的列 数据类型 函数参数或函数结果 参考约束 模式 表约束 表 触发器 用户定义函数 视图

SYSCAT.CHECKS SYSCAT.COLUMNS SYSCAT.COLCHECKS SYSCAT.KEYCOLUSE SYSCAT.DATATYPES SYSCAT.FUNCPARMS SYSCAT.REFERENCES SYSCAT.SCHEMATA SYSCAT.TABCONST SYSCAT.TABLES SYSCAT.TRIGGERS SYSCAT.FUNCTIONS SYSCAT.VIEWS 五、 数据类型

数据类型 类型 特性 示例或范围 定长字最大长度为 254 'Sunny day ' 符串 变长字VARCHAR(15) 最大长度为 4000 'Sunny day' 符 长度为 2 字节精SMALLINT 数字 范围为-32768 至 32767 度为 5 位 长度为 4 字节精范围为INTEGER 数字 度为 10 位 -2147483648 至 2147483647 范围为-3.402E+38至-1.175E-37单精度浮点32 位REAL 数字 或 1.175E-37 至-3.402E+38或近似值 零 范围为-1.79769E+308 至双精度浮点64 位-2.225E-307DOUBLE 数字 近似值 或 2.225E-307 至 1.79769E+308或零 精度为 5小数位DECIMAL(5,2) 数字 范围为 -10**31+1 至 10**31-1 为 2 日期时 三部分DATE 间 值 1991-10-27 日期时 三部分TIME 间 值 13.30.05 CHAR(15) TIMESTAMP BLOB CLOB 日期时间 七部分值 1991-10-27-13.30.05.000000 存储长度可变的二二进制进制数据,长度最大对象大为 2 GB。超过 1 字符串 GB 的长度不进行日志记录 存储长度可变的字字符大符数据,长度最大对象字为 2 GB。超过 1 GB 符串 的长度不进行日志记录。

六、 函数

1、 列函数

列函数对列中的一组值进行运算以得到单个结果值。下列就是一些列函数的示例。

AVG

返回某一组中的值除以该组中值的个数的和 COUNT

返回一组行或值中行或值的个数 MAX

返回一组值中的最大值 MIN

返回一组值中的最小值

2、 标量函数

标量函数对值进行某个运算以返回另一个值。下列就是一些由DB2 通用数据库提供的标量函数的示例。

ABS

返回数的绝对值 HEX

返回值的十六进制表示 LENGTH

返回自变量中的字节数(对于图形字符串则返回双字节字符数。) YEAR

抽取日期时间值的年份部分

七、 编程技巧

1、 DB2编程 1.1 变量赋值

对变量的赋值不能用select ..into ..方式而要用set v=(select ..)的方

式,代码示例如下。

CREATE FUNCTION SXFM.ISORDERSUBMITDATE(IN_ROW_ID DECIMAL(16,0)) RETURNS DATE LANGUAGE SQL BEGIN ATOMIC

DECLARE V_SUBMIT_DATE DATE;

DECLARE V_SELL_ID DECIMAL(16, 0); DECLARE V_BUY_ID DECIMAL(16, 0);

set V_SELL_ID = (SELECT COALESCE(RECEIVE_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID);

set V_BUY_ID = (SELECT COALESCE(PAY_ID,-1) FROM IS_ORDER WHERE ROW_ID=IN_ROW_ID); set V_SUBMIT_DATE = (SELECT DATE(MAX(A.SUBMIT_DATE)) FROM AM_AUDIT_QUEUE

A,SM_USER B,SM_USER C

WHERE A.TABLE_CODE='IS_ORDER' AND A.TABLE_ROW_ID=IN_ROW_ID

AND A.AUDIT_EMP_ID=C.ROW_ID AND C.BRANCH_ID=V_BUY_ID --审核方为付款方 AND A.SUBMIT_EMP_ID=B.ROW_ID AND B.BRANCH_ID=V_SELL_ID); --提交方为收款方

RETURN V_SUBMIT_DATE; END;

1.2 建存储过程时Create 后一定不要用TAB键

CREATE PROCEDURE 的CREATE后只能用空格,而不可用TAB健,否则编译会通不过。

1.3 使用临时表

要注意,临时表只能建在USER TEMPORY TABLES SPACE 上,如果DATABASE

只有SYSTEM TEMPORY TABLE SPACE是不能建临时表的。 另外,DB2的临时表和SYBASE及ORACLE的临时表不太一样,DB2的临时表是在一个SESSION内有效的。所以,如果程序有多线程,最好不要用临时表,很难控制。建临时表时最好加上 WITH REPLACE选项,这样就可以不显示的DROP 临时表,建临时表时如果不加该选项而该临时表在该SESSION内已创建且没有DROP,这时会发生错误。

1.4 从数据表中取指定前几条记录

SELECT * FROM TB_MARKET_CODE FETCH FIRST 1 ROWS ONLY 但下面这种方式不允许

SELECT MARKET_CODE INTO V_MARKET_CODE FROM TB_MARKET_CODE FETCH FIRST 1 ROWS ONLY;

选第一条记录的字段到一个变量以以下方式代替 DECLARE V_MARKET_CODE CHAR(1);

DECLARE CURSOR1 CURSOR FOR SELECT MARKET_CODE FROM TB_MARKET_CODE

FETCH FIRST 1 ROWS ONLY FOR UPDATE; OPEN CURSOR1;

FETCH CURSOR1 INTO V_MARKET_CODE; CLOSE CURSOR1;

1.5 游标的使用

注意COMMIT和ROLLBACK ,使用游标时要特别注意如果没有加WITH HOLD 选项,在COMMIT和ROLLBACK时,该游标将被关闭。COMMIT 和ROLLBACK有很多东西要注意。特别小心游标的两种定义方式 : 一种为

DECLARE CONTINUE HANDLER FOR NOT FOUND BEGIN

SET V_NOTFOUND = 1; END;

DECLARE CURSOR1 CURSOR WITH HOLD FOR SELECT MARKET_CODE FROM TB_MARKET_CODE FOR UPDATE; OPEN CURSOR1; SET V_NOTFOUND=0;

FETCH CURSOR1 INTO V_MARKET_CODE; WHILE V_NOTFOUND=0 DO --WORK

SET V_NOTFOUND=0;

FETCH CURSOR1 INTO V_MARKET_CODE; END WHILE;

CLOSE CURSOR1;

这种方式使用起来比较复杂,但也比较灵活。特别是可以使用WITH HOLD 选项。如果循环内有COMMIT或ROLLBACK 而要保持该CURSOR不被关闭,只能使用这种方式。 另一种为

PCURSOR1: FOR LOOPCS1 AS COUSOR1 CURSOR AS SELECT MARKET_CODE AS MARKET_CODE FROM TB_MARKET_CODE FOR UPDATE DO

END FOR;

这种方式的优点是比较简单,不用(也不允许)使用OPEN,FETCH,CLOSE。 但不能使用WITH HOLD 选项。如果在游标循环内要使用COMMIT,ROLLBACK则不能使用这种方式。如果没有COMMIT或ROLLBACK的要求,推荐使用这种方式(看来FOR这种方式有问题)。 修改游标的当前记录的方法

UPDATE TB_MARKET_CODE SET MARKET_CODE='0' WHERE CURRENT OF CURSOR1; 不过要注意将CURSOR1定义为可修改的游标

DECLARE CURSOR1 CURSOR FOR SELECT MARKET_CODE FROM TB_MARKET_CODE FOR UPDATE;

FOR UPDATE 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, OR INTERSECT但 UNION ALL除外)一起使用。

1.6 类似decode的转码操作

ORACLE中有一个数 SELECT DECODE(A1,'1','N1','2','N2','N3') AA1 FROM DB2没有该函数,但可以用变通的方法 SELECT CASE A1

WHEN '1' THEN 'N1' WHEN '2' THEN 'N2' ELSE 'N3'

END AS AA1 FROM

1.7 类似charindex查找字符在字串中的位置

LOCATE(‘Y’,’DFDASFAY’)

查找’Y’ 在’DFDASFAY’中的位置。

1.8 类似datedif计算两个日期的相差天数

DAYS(DATE(‘2001-06-05’)) – DAYS(DATE(‘2001-04-01’)) DAYS 返回的是从 0001-01-01 开始计算的天数

1.9 写UDF的例子

C写见SQLLIB\\SAMPLES\\CLI\\UDFSRV.C

1.10 创建含identity值(即自动生成的ID)的表

CREATE TABLE TEST

(T1 SMALLINT NOT NULL

GENERATED ALWAYS AS IDENTITY

(START WITH 500, INCREMENT BY 1), T2 CHAR(1));

在一个表中只允许有一个IDENTITY的COLUMN。

1.11 预防字段空值的处理

SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT

FROM DEPARTMENT

COALESCE函数返回()中表达式列表中第一个不为空的表达式,可以带多个表达式。 和ORACLE的ISNULL类似,但ISNULL好象只能两个表达式。

1.12 得到处理的记录数

DECLARE V_COUNT INT;

UPDATE TB_TEST SET T1=’0’WHERE T2=’2’;

--检查修改的行数,判断指定的记录是否存在 GET DIAGNOSTICS V_ COUNT=ROW_COUNT;

只对UPDATE,INSERT,DELETE起作用,不对SELECT INTO 有效。

1.13 从存储过程返回结果集(游标)的用法

1、建一SP返回结果集

CREATE PROCEDURE DB2INST1.PROC1 ( ) LANGUAGE SQL

RESULT SETS 2(返回两个结果集)

------------------------------------------------------------------------

-- SQL 存储过程

------------------------------------------------------------------------

P1: BEGIN

DECLARE C1 CURSOR WITH RETURN TO CALLER FOR SELECT MARKET_CODE FROM TB_MARKET_CODE;

--指定该结果集用于返回给调用者

DECLARE C2 CURSOR WITH RETURN TO CALLER FOR SELECT MARKET_CODE FROM TB_MARKET_CODE; OPEN C1; OPEN C2;

END P1

2、建一SP调该SP且使用它的结果集

CREATE PROCEDURE DB2INST1.PROC2 ( OUT OUT_MARKET_CODE CHAR(1)) LANGUAGE SQL

------------------------------------------------------------------------

-- SQL 存储过程

------------------------------------------------------------------------

P1: BEGIN

DECLARE LOC1,LOC2 RESULT_SET_LOCATOR VARYING; --建立一个结果集数组 CALL PROC1;

--调用该SP返回结果集。

ASSOCIATE RESULT SET LOCATOR(LOC1,LOC2) WITH PROCEDURE PROC1; --将返回结果集和结果集数组关联

ALLOCATE CURSOR1 CURSOR FOR RESULT SET LOC1; ALLOCATE CURSOR2 CURSOR FOR RESULT SET LOC2; --将结果集数组分配给CURSOR

FETCH CURSOR1 INTO OUT_MARKET_CODE; --直接从结果集中赋值 CLOSE CURSOR1; END P1

3、动态SQL写法

DECLARE CURSOR C1 FOR STMT1; PREPARE STMT1 FROM

'ALLOCATE C2 CURSOR FOR RESULT SET ?'; 4、注意:

一、 如果一个SP调用好几次,只能取到最近一次调用的结果集。

二、 ALLOCATE的CURSOR不能再次OPEN,但可以CLOSE,是CLOSE SP中的对应CURSOR。

1.14 类型转换函数

SELECT CAST ( CURRENT TIME AS CHAR(8)) FROM TB_MARKET_CODE

1.15 存储过程的互相调用

目前,C SP可以互相调用。SQL SP 可以互相调用,SQL SP 可以调用C SP,但C SP 不可以调用SQL SP(最新的说法是可以) 。

1.16 存储过程参数注意

CREATE PROCEDURE PR_CLEAR_TASK_CTRL( IN IN_BRANCH_CODE CHAR(4),

IN IN_TRADEDATE CHAR(8), IN IN_TASK_ID CHAR(2), IN IN_SUB_TASK_ID CHAR(4), OUT OUT_SUCCESS_FLAG INTEGER ) DYNAMIC RESULT SETS 0 LANGUAGE C

PARAMETER STYLE GENERAL WITH NULLS(如果不是这样,SQL 的SP将不能调用该用C写的存储过程,产生保护性错误) NO DBINFO FENCED

MODIFIES SQL DATA

EXTERNAL NAME 'PR_CLEAR_TASK_CTRL!PR_CLEAR_TASK_CTRL'@

1.17 存储过程fence及unfence

FENCE的存储过程单独启用一个新的地址空间,而UNFENCE的存储过程和调用它的进程使用同一个地址空间。 一般而言,FENCE的存储过程比较安全。但有时一些特殊的要求,如要取调用者的PID,则FENCE的存储过程会取不到,而只有UNFENCE的能取到。

1.18 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.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 不起作用。

如果是用ACTIVATE DB启动的数据库,一定要用DEACTIVATE DB才会停止该数据库。(当然如果是DB2STOP也会停止)。

使用ACTIVATE DB,这样可以减少第一次连接时的等待时间。

DATABASE如果不是使用ACTIVATE DB启动而是通过连接数据库而启动的话,当所有的连接都退出后,DB也就自动停止。

4.5 查看及停止数据库当前的应用程序

查看应用程序:

DB2 LIST APPLICATIONS SHOW DETAIL

授权标识 | 应用程序名 | 应用程序句柄 | 应用程序标识 | 序号# | 代理程序 | 协调程序 | 状态 | 状态更改时间 | DB 名 | DB 路径| | 节点号 | PID/线程

其中:1、应用程序标识的第一部分是应用程序的IP地址,不过是已16进制表示的。

2、PID/线程即是在UNIX下看到的线程号。

停止应用程序:

DB2 \DB2 “FORCE APPLICATION ALL”

其中:该236是查看中的应用程序句柄。

4.6 查看本instance下有哪些database

DB2 LIST DATABASE DIRECTORY [ ON /HOME/DB2INST1 ]

4.7 查看及更改数据库head的配置

请注意,在大多数情况下,更改了数据的配置后,只有在所有的连接全部断掉后才会生效。

查看数据库HEAD的配制 DB2 GET DB CFG FOR HEAD

更改数据库HEAD的某个设置的值

----改排序堆的大小

DB2 UPDATE DB CFG FOR HEAD USING SORTHEAP 2048 将排序堆的大小改为2048个页面,查询比较多的应用最好将该值设置比较大一些。

----改事物日志的大小

DB2 UPDATE DB CFG FOR HEAD USING LOGFILSIZ 40000

该项内容的大小要和数据库的事物处理相适应,如果事物比较大,应该要将该值改大一点。否则很容易处理日志文件满的错误。 ----出现程序堆内存不足时修改程序堆内存大小

DB2 UPDATE DB CFG FOR HEAD USING APPLHEAPSZ 40000 该值不能太小,否则会没有足够的内存来运行应用程序。

4.8 查看及更改数据库实例的配置

----查看数据库实例配置 DB2 GET DBM CFG

----打开对锁定情况的监控。

DB2 UPDATE DBM CFG USING DFT_MON_LOCK ON ----更改诊断错误捕捉级别

DB2 UPDATE DBM CFG USING DIAGLEVEL 3 0 为不记录信息 1 为仅记录错误

2 记录服务和非服务错误

缺省是3,记录DB2的错误和警告

4 是记录全部信息,包括成功执行的信息

一般情况下,请不要用4,会造成DB2的运行速度非常慢。

4.9 db2环境变量

DB2 重装后用如下方式设置DB2的环境变量,以保证SP可编译 将SET_CPL 放到AIX上, CHMOD +X SET_CPL, 再运行之

SET_CPL的内容

DB2SET DB2_SQLROUTINE_COMPILE_COMMAND=\-I$HOME/SQLLIB/INCLUDE SQLROUTINE_FILENAME.C \\ -BE:SQLROUTINE_FILENAME.EXP -E SQLROUTINE_ENTRY \\ -O SQLROUTINE_FILENAME -L$HOME/SQLLIB/LIB -LC -LDB2\DB2SET DB2_SQLROUTINE_KEEP_FILES=1

4.10 db2命令环境设置

DB2=>LIST COMMAND OPTIONS

DB2=>UPDATE COMMAND OPTIONS USING C OFF--或ON,只是临时改变 DB2=>DB2SET DB2OPTIONS=+C --或-C,永久改变

4.11 改变隔离级别

DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|UR

交互环境更改SESSION的隔离级别, DB2 CHANGE ISOLATION TO UR

请注意只有没有连接数据库时可以这样来改变隔离级别。

4.12 管理db\\instance的参数

GET DB CFG FOR HEAD(DB) GET DBM CFG(INSTANCE)

4.13 升级后消除版本问题

DB2 BIND @DB2UBIND.LST DB2 BIND @DB2CLI.LST

4.14 查看数据库表的死锁

再用命令中心查询数据时要注意,如果用了交互式查询数据,命令中心将会给所查的记录加了S锁.这时如果要UPDATE记录,由于UPDATE要使用X锁,排它锁,将会处于锁等待. 首先,将监视开关打开

DB2 UPDATE DBM CFG USING DFT_MON_LOCK ON 快照

DB2 GET SNAPSHOT FOR LOCKS ON CLEARDB >SNAP.LOG TABLES BUFFERPOOLS TABLESPACES DATABASE

然后再看SNAP.LOG中的内容即可。

对LOCK可根据APPLICATION HANDLE(应用程序句柄)看每个应用程序的锁

的情况。

监视完毕后,不要忘了将监视器关闭

DB2 UPDATE DBM CFG USING DFT_MON_LOCK OFF

八、 性能优化

1、 数据库配置

2、 统计信息

a) 更新单张表和索引的统计信息

Db2 –v runstats on table tab_name and indexes all

b) 更新全部表的统计信息

Db2 –v reorgchk update statistics on table all

c)

查看统计信息

Db2 –v “select tbname,nleaf,nlevels,stats_time from sysibm.sysindexes”

3、 Sql解析工具

a) Visual explain

b) Db2exfmt

I. 开启explain

Db2 set current explain mode yes

II. 执行db2exfmt,得到sql查询树 C:\\>db2exfmt DB2 Universal Database Version 9.0, 5622-044 (c) Copyright IBM Corp. 1991, 2006

Licensed Material - Program Property of IBM IBM DATABASE 2 Explain Table Format Tool

Enter Database Name ==> sample Connecting to the Database. Connect to Database Successful.

Binding package - Bind was Successful

Enter up to 26 character Explain timestamp (Default -1) ==> Enter up to 8 character source name (SOURCE_NAME, Default %%) ==>

Enter source schema (SOURCE_SCHEMA, Default %%) ==> Enter section number (0 for all, Default 0) ==> Enter outfile name. Default is to terminal ==>

DB2 Universal Database Version 9.0, 5622-044 (c) Copyright IBM Corp. 1991, 2006

Licensed Material - Program Property of IBM IBM DATABASE 2 Explain Table Format Tool

******************** EXPLAIN INSTANCE ********************

DB2_VERSION: 09.00.0 SOURCE_NAME: SQLC2F0A SOURCE_SCHEMA: NULLID SOURCE_VERSION:

EXPLAIN_TIME: 2007-01-15-17.24.14.432001 EXPLAIN_REQUESTER: ADMINISTRATOR

Database Context: ----------------

Parallelism: None

CPU Speed: 4.251098e-007 Comm Speed: 100 Buffer Pool size: 250 Sort Heap size: 256 Database Heap size: 600 Lock List size: 50 Maximum Lock List: 22 Average Applications: 1 Locks Available: 935

Package Context: ---------------

SQL Type: Dynamic Optimization Level: 5

Blocking: Block All Cursors Isolation Level: Cursor Stability

---------------- STATEMENT 1 SECTION 201 ---------------- QUERYNO: 1 QUERYTAG: CLP Statement Type: Select Updatable: No Deletable: No

Query Degree: 1

Original Statement: ------------------ select *

from administrator.employee

Optimized Statement: -------------------

SELECT Q1.\Q1.\ \Q1.\AS \Q1.\

Q1.\AS \Q1.\AS \

\Q1.\

AS \AS \

Q1.\

FROM ADMINISTRATOR.EMPLOYEE AS Q1

Access Plan: -----------

Total Cost: 15.1785 Query Degree: 1

Rows RETURN ( 1) Cost I/O | 42 TBSCAN ( 2) 15.1785 2 | 42

TABLE: ADMINISTRATOR EMPLOYEE

Extended Diagnostic Information: --------------------------------

Diagnostic Identifier: 1

Diagnostic Details: EXP0058W The following MQT or statistical view was

not considered for rewrite matching because of one

or more of the following reasons: (1) MQT was in

SET INTEGRITY PENDING state, or (2) MQT would be

put to SET INTEGRITY PENDING state, or (3) MQT was

modified in the same statement, or (4) MQT or

statistical view was not enabled for optimization:

\

Plan Details: -------------

1) RETURN: (Return Result)

Cumulative Total Cost: 15.1785 Cumulative CPU Cost: 137639 Cumulative I/O Cost: 2

Cumulative Re-Total Cost: 0.0314777 Cumulative Re-CPU Cost: 74046 Cumulative Re-I/O Cost: 0

Cumulative First Row Cost: 7.58224 Estimated Bufferpool Buffers: 2

Arguments: ---------

BLDLEVEL: (Build level)

DB2 v9.0.0.257 : s060328 STMTHEAP: (Statement heap size) 2048

本文来源:https://www.bwwdw.com/article/12q5.html

Top