构建数据库环境
首先我们在 WINDOWS XP 环境下安装 DB2 ESE V9.5,安装完成后,打开一个 DB2CLP 窗口,发出CREATE DB 命令,创建示例数据库 DB2TEST1,命令中需要指定数据库代码页或数据库代码集,因为在 DB2 V9.5 中所有创建的数据库默认情况下数据库代码页都是 1208,数据库代码集都是 UTF-8,这点和之前的版本不一样。如果想把数据库代码页设置成 1386,数据库代码集设置成 GBK,就需要在 CREATE DB 命令中把数据库代码页设置成 1386 或者把数据库代码集设置成 GBK。具体如清单 1 所示:
清单1. 创建示例数据库 DB2TEST1
C:\> DB2 CREATE DATABASE DB2TEST1 USING CODESET GBK TERRITORY CN COLLATE
USING SYSTEM PAGESIZE 4096
DB20000I CREATE DATABASE 命令成功完成。
命令执行成功,这样我们创建了一个示例数据库 DB2TEST1。继续在这个 DB2CLP 窗口中发出 GET DB CFG 命令,查看示例数据库 DB2TEST1 的配置参数,我们可以看到数据库地域是 CN,数据库代码页被设置成了 1386,数据库代码集被设置成了 GBK。另外,在 DB2 V9.5 新增了几个参数,分别是数字兼容性、Varchar2 兼容性、十进制浮点舍入方式、启用 XML 字符操作和 WLM 收集时间间隔(分钟),这些参数的具体信息可以查看 DB2 信息中心。查看示例数据库 DB2TEST1 配置参数的详细情况请参见清单 2 所示:
清单 2. 查看示例数据库 DB2TEST1 配置参数
C:\> db2 get db cfg for db2test1
数据库 db2test1 的数据库配置
数据库配置发行版级别 = 0x0c00
数据库发行版级别 = 0x0c00
数据库地域 = CN
数据库代码页 = 1386
数据库代码集 = GBK
数据库国家/地区代码 = 86
数据库整理顺序 = UNIQUE
备用整理顺序 ( ALT_COLLATE ) =
数字兼容性 = OFF
Varchar2 兼容性 = OFF
数据库页大小 = 4096
动态 SQL 查询管理 ( DYN_QUERY_MGMT ) = DISABLE
对此数据库的发现支持 ( DISCOVER_DB ) = ENABLE
限制访问 = NO
缺省查询优化类 ( DFT_QUERYOPT ) = 5
并行度 ( DFT_DEGREE ) = 1
在算术异常时继续 ( DFT_SQLMATHWARN ) = NO
缺省刷新有效期 ( DFT_REFRESH_AGE ) = 0
缺省维护的选项( DFT_MTTB_TYPES )的表类型 = SYSTEM
保留的高频值的数目 ( NUM_FREQVALUES ) = 10
保留的分位点数目 ( NUM_QUANTILES ) = 20
十进制浮点舍入方式 ( DECFLT_ROUNDING ) = ROUND_HALF_EVEN
. . . . . . . . . .
自调整内存 ( SELF_TUNING_MEM ) = ON
数据库共享内存大小(4 KB) ( DATABASE_MEMORY ) = AUTOMATIC
数据库内存阈值 ( DB_MEM_THRESH ) = 10
锁定列表的最大存储量(4 KB) ( LOCKLIST ) = AUTOMATIC
每个应用程序的锁定百分比列表 ( MAXLOCKS ) = AUTOMATIC
程序包高速缓存大小(4 KB) ( PCKCACHESZ ) = AUTOMATIC
共享排序的排序堆域值(4 KB) ( SHEAPTHRES_SHR ) = AUTOMATIC
排序列表堆(4 KB) ( SORTHEAP ) = AUTOMATIC
. . . . . . . . . .
自动维护 ( AUTO_MAINT ) = ON
自动数据库备份 ( AUTO_DB_BACKUP ) = OFF
自动表维护 ( AUTO_TBL_MAINT ) = ON
自动 runstats ( AUTO_RUNSTATS ) = ON
自动语句统计信息 ( AUTO_STMT_STATS ) = OFF
自动统计信息概要分析 ( AUTO_STATS_PROF ) = OFF
自动概要文件更新 ( AUTO_PROF_UPD ) = OFF
自动重组 ( AUTO_REORG ) = OFF
启用 XML 字符操作 ( ENABLE_XMLCHAR ) = YES
WLM 收集时间间隔(分钟) ( WLM_COLLECT_INT ) = 0
继续在这个 DB2CLP 窗口中,发出 DB2LEVEL 命令,查看 DB2 的版本信息,需要注意 DB2 代码发行版是 " SQL09050 ",工作负载管理(WLM)是从 DB2 V9.5 开始的,具体如清单 3 所示:
清单 3. 查看示例数据库 DB2TEST1 的版本情况
C:\> db2level
DB21085I 实例 " DB2_01 " 使用 " 32 " 位和 DB2 代码发行版 " SQL09050 ",级别标识为" 03010107 "。
参考标记为 " DB2 v9.5.0.808 "、" s071001 " 和 " NT3295 ",修订包为 " 0 "。
产品使用 DB2 副本名 " DB2COPY2 " 安装在 " C:\PROGRA~1\IBM\SQLLIB~1 " 中。
我们在操作系统中存在两个用户,分别是 RHETTE,和 DB2ADMIN,密码都是 passw0rd。我们使用RHETTE 用户在 DB2CLP 窗口中连上示例数据库 DB2TEST1,执行带有 CREATE TABLE 语句的脚本 project.sql,创建示例表 PROJECT,具体如清单 4 所示:
清单4 . 创建示例表 PROJECT
C:\> db2 connect to db2test1
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\>db2 -tvf project.sql
CREATE TABLE "RHETTE"."PROJECT" ( "PROJNO" CHAR ( 6 ) NOT NULL ,
"PROJNAME" VARCHAR ( 24 ) NOT NULL WITH DEFAULT '' , "DEPTNO" CHAR ( 3 ) NOT NULL ,
"RESPEMP" CHAR ( 6 ) NOT NULL , "PRSTAFF" DECIMAL ( 5 , 2 ) , "PRSTDATE" DATE ,
"PRENDATE" DATE , "MAJPROJ" CHAR ( 6 ) ) IN "USERSPACE1"
DB20000I SQL命令成功完成。
ALTER TABLE "RHETTE"."PROJECT" ADD CONSTRAINT "PK_PROJECT" PRIMARY KEY ( "PROJNO" )
DB20000I SQL命令成功完成。
CREATE INDEX "RHETTE"."XPROJ2" ON "RHETTE"."PROJECT" ( "RESPEMP" ASC)
ALLOW REVERSE SCANS
DB20000I SQL命令成功完成。
继续在 DB2CLP 窗口中插入测试数据,然后发出 SELECT 语句,我们可以看到这些数据,具体如清单 5 所示:
清单5 . 插入数据到示例表 PROJECT 中
C:\> db2 select * from project
PROJNO PROJNAME DEPTNO RESPEMP PRSTAFF PRSTDATE PRENDATE MAJPROJ
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AD3100 ADMIN SERVICES D01 000010 6.50 2002-01-01 2003-02-01 -
AD3110 GENERAL ADMIN SYSTEMS D21 000070 6.00 2002-01-01 2003-02-01
AD3100
AD3111 PAYROLL PROGRAMMING D21 000230 2.00 2002-01-01 2003-02-01
AD3110
AD3112 PERSONNEL PROGRAMMING D21 000250 1.00 2002-01-01 2003-02-01
AD3110
AD3113 ACCOUNT PROGRAMMING D21 000270 2.00 2002-01-01 2003-02-01
AD3110
IF1000 QUERY SERVICES C01 000030 2.00 2002-01-01 2003-02-01 -
IF2000 USER EDUCATION C01 000030 1.00 2002-01-01 2003-02-01 -
MA2100 WELD LINE AUTOMATION D01 000010 12.00 2002-01-01 2003-02-01 -
MA2110 W L PROGRAMMING D11 000060 9.00 2002-01-01 2003-02-01
MA2100
MA2111 W L PROGRAM DESIGN D11 000220 2.00 2002-01-01 1982-12-01
MA2110
MA2112 W L ROBOT DESIGN D11 000150 3.00 2002-01-01 1982-12-01
MA2110
MA2113 W L PROD CONT PROGS D11 000160 3.00 2002-02-15 1982-12-01
MA2110
OP1000 OPERATION SUPPORT E01 000050 6.00 2002-01-01 2003-02-01 -
OP1010 OPERATION E11 000090 5.00 2002-01-01 2003-02-01
OP1000
OP2000 GEN SYSTEMS SERVICES E01 000050 5.00 2002-01-01 2003-02-01 -
OP2010 SYSTEMS SUPPORT E21 000100 4.00 2002-01-01 2003-02-01
OP2000
OP2011 SCP SYSTEMS SUPPORT E21 000320 1.00 2002-01-01 2003-02-01
OP2010
OP2012 APPLICATIONS SUPPORT E21 000330 1.00 2002-01-01 2003-02-01
OP2010
OP2013 DB/DC SUPPORT E21 000340 1.00 2002-01-01 2003-02-01
OP2010
PL2100 WELD LINE PLANNING B01 000020 1.00 2002-01-01 2002-09-15
MA2100
20 条记录已选择。
定义服务类(SERVICE CLASS)
服务类的目的是为工作运行定义一个执行环境,这个环境包含可用的资源和不同的执行阈值,当你定义一个工作负载时,你必须为之指定对应的服务类。如果你没有显式的定义工作负载,用户数据库请求会被认为是系统默认的工作负载,其对应的服务类是系统默认的用户服务类。所有的系统数据库请求,对应的都是默认系统服务类。
所有的数据库请求都是在服务类中执行的,并且在服务类中获得相应的资源。所有的连接都是映射到工作负载上的,所有的工作负载都是映射到服务类上的。针对服务类中资源分配的情况,可以定义相应的阈值,来进行限定。DB2 的服务类拥有两层结构:服务父类(Service Superclass)和服务子类(Service Subclass)。
当你使用服务类时,你可以通过控制这个服务类的一系列属性,使不同的工作具有不同的优先级。比如,你可以设置服务类中工作的 I/O 页预取优先级,设置服务类中所有代理的 CPU 优先级,你还可以通过不同类型的阈值控制服务类中工作所使用的资源。
下面我们打开一个 DB2CLP 窗口,发出 ALTER SERVICE CLASS 命令,使服务类 super_class、服务子类subclass_rhette、subclass_db2admin 失效,接着发出 DROP SERVICE CLASS 命令,删除服务类和服务子类。需要注意的是,如果你想删除一个服务父类(service superclass),需要保证所有相关的服务子类、工作负载、连接、动作、阈值等都无效。DROP SERVICE CLASS 命令成功完成后,发出 CREATE SERVICE CLASS 命令,创建我们需要的服务父类和服务子类,具体如清单 6 所示:
清单 6 . 创建服务类和服务子类
C:\> db2 -tvf create_serviceclass.sql
alter service class subclass_rhette under super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
alter service class subclass_db2admin under super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
alter service class super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
drop service class subclass_rhette under super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
drop service class subclass_db2admin under super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
drop service class super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " SUPER_CLASS " 是一个未定义的名称。 SQLSTATE = 42704
create service class super_class
DB20000I SQL命令成功完成。
create service class subclass_rhette under super_class agent priority
default prefetch priority default collect activity data on all with details
and values collect aggregate activity data base collect aggregate request data base
DB20000I SQL命令成功完成。
create service class subclass_db2admin under super_class agent priority 6
prefetch priority high
DB20000I SQL命令成功完成。
名称成功完成,需要注意的是我们在执行 CREATE SERVICE CLASS 命令时,指定了多个选项,下面来分别介绍一下:
AGENT PRIORITY DEFAULT or AGENT PRIORITY integer-constant
代理进程的优先级实际是 CPU 的优先级。
需要注意的是,使用这个属性只适用于用户请求对应的服务类,不适合系统数据库请求对应的系统服务类。你可以使用这个属性把当前服务类中代理的线程优先级和其他服务类区别开来。
AGENT PRIORITY integer-constant:指定运行在服务类中的代理相对于操作系统优先级的相对值。 AGENT PRIORITY DEFAULT:和运行在 DB2 中的线程一样的正常优先级。默认值是 DEFAULT。当代理优先级设置为 DEFAULT 时,没有特殊的操作发生,服务类中的代理将按照所有的 DB2 线程一样的优先级进行调度。DEDAULT 对应的值是 -32768。