【IT168 技术文档】
IBM 的 DB2 V9.5 引入并完善了工作负载管理(WORKLOAD MANAGEMENT)功能,使得我们可以更深入地洞察系统的运行情况并更好地控制资源和性能。在 DB2 V9.5 中,新引入的工作负载管理功能(WLM)可以帮助您标识、管理和监视数据服务器的工作负载。本文将重点介绍 DB2 V9.5 关于工作负载管理(WLM)的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。
简介
IBM 的 DB2 V9.5 引入并完善了工作负载管理(WORKLOAD MANAGEMENT)功能,使得我们可以更深入地洞察系统的运行情况并更好地控制资源和性能。在 DB2 V9.5 中,新引入的工作负载管理功能(WLM)可以帮助您标识、管理和监视数据服务器的工作负载。工作负载管理提供了第一个真正集成到 DB2 数据服务器的工作负载管理解决方案,对标识声明的支持使您可以为多层应用程序环境中的各个用户或组提供工作负载管理。
一个好的工作负载管理(WLM)系统能够能够帮助企业更有效的监控系统的运行情况。由于 DB2 V9.5 的数据管理方面得到了极大的增强,在数据库服务器环境中,你可以获得远远超过你预期的高效的管理性能。为了保证数据库服务器得到最大的性能,一个高效的工作负载管理(WLM)系统是必需的。一个成功的工作负载管理(WLM)需要考虑很多方面,并且要清楚的知道自己的目标是什么,比如核心的业务将获得更多的资源,一些非核心的业务对其能够获取的资源进行一定的限制,又或者,对一些流氓查询进行限制等等。在数据库服务器环境中,你必须定义目标。有些时候目标是清晰的,特别是他们源自服务级别协议(SLA)目标的时候。比如,你可以在 AIX 操作平台地 DB2 上设定一个特定的应用程序所耗费的 CPU资源不能超过所有 CPU 资源总量的 10%(可以通过和 AIX WLM 结合实现)。目标还可以限定在一天中的某一个时间,比如,一个通宵运行的批处理实用程序必须在早上 8 点之前完成,以满足每天的销售报告能够按时出来。但是在其他的情况下,目标是比较难以量化的,比如想设置这样一个目标,保持数据库用户满意并且防止意外的数据库活动干扰用户们的日常工作。不管工作目标是否可以量化,理解工作负载管理分成哪几个阶段很重要。工作负载管理(WLM)有三个阶段,分别是:
标识阶段(Identification Stage)
标识阶段是工作负载管理解决方案的第一步,用来对数据库服务器当前运行的工作进行鉴定标识。如果你想对某一种类型的工作完成设定的目标,第一步需要能够标识出这个工作的具体信息。标识一个具体工作的方法有很多中,比如可以使用应用程序的名称、授权 ID(Authorization ID)等。
管理阶段(Management Stage)
管理阶段是工作负载管理解决方案的第二步。
在鉴定了工作的类型后,接下是对这个工作的动态管理,你可以对这个工作分配资源或者进行严格控制。管理阶段包含保证完成你的目标的机制,当不符合你设定的目标时将采取相应的操作。在数据库服务器上,你会发现,当存在一些低效 SQL 语句时,整体性能会受到很大影响,高峰期时会占据大量资源,或者不同的应用会过度争用同一资源。
监控阶段(Monitoring Stage)
在鉴定了工作的类型后,接下是对这个工作的动态管理,你可以对这个工作分配资源或者进行严格控制。管理阶段包含保证完成你的目标的机制,当不符合你设定的目标时将采取相应的操作。在数据库服务器上,你会发现,当存在一些低效 SQL 语句时,整体性能会受到很大影响,高峰期时会占据大量资源,或者不同的应用会过度争用同一资源。
工作负载管理的流程如图1所示:
图1 . 工作负载管理流程
工作负载管理功能(WLM)允许我们将数据服务器上的工作按类进行划分并进行相应的设置,以便能够支持同一系统上的各种用户和应用程序。在引入了 WLM 后,以面向核心业务系统,以事务处理为主的数据库和以面向决策支持、辅助分析的,以数据挖掘为主的数据库现在可以选择合并成一个数据库,也就是说,现在 DB2 支持多种混合类型的工作负载,可以同时兼容事务处理和数据挖掘,从而为设计的灵活性提供更大的支持。通过使用工作负载定义自动标识工作、将工作负载分配给服务类并将资源分配到每个服务类,可以将工作划分为易管理的逻辑组。可以捕获详细的工作负载概要文件和性能信息,以帮助优化我们的工作负载定义和服务类定义。可以通过成本、时间和并行性阈值来控制执行情况,这使我们可以控制流氓查询并有助于达到服务级别协议(SLA)目标。通过使用阈值,系统可以自动对不良情况作出反应或在它发生前进行预测。当我们控制了长时间运行且复杂的查询的影响后,我们就可以使事务保持平稳运行。我们可以跟踪处理的每个阶段,以便可以为用户提供最新的状态信息。
另外,在 AIX 操作系统平台上,DB2 服务类提供一个可选的功能,用来把 DB2 进程和 AIX 本身的工作负载管理器(WLM)服务类紧密集成,从而可以利用 AIX 操作系统的功能。每个 DB2 服务类可以分配给特定的 AIX WLM 服务类,在 DB2 服务类中工作的所有代理将由 DB2 自动分配给相应的 AIX WLM 服务类。比如,AIX WLM 可以动态地调整 CPU 份额或使用其他服务类的备用 CPU 份额来最大程度地利用数据服务器。AIX WLM 将对 CPU 进行富有成效的管理,在直接分配资源时使 CPU 得到更好的利用,具体包括:
– 通过分配给 AIX WLM 服务类相应的 CPU 份额,完成 CPU 资源的分配
– CPU 份额可以使用 AIX WLM 接口进行动态调节
– 提供从其他服务类借用其空闲 CPU 份额的能力
– 通过 AIX 服务类可以提供操作系统基本的统计信息
需要注意的是,虽然 AIX WLM 能够为正在运行的进程提供 CPU,I/O 以及内存方面的控制,但是,在 DB2 V9.5 中,DB2 只能受益于 AIX WLM 的 CPU 的部分。
下面我们分别来具体看一下工作负载管理(WLM)的三个阶段,首先看一下识别阶段(Identification Stage)。标识阶段是工作负载管理解决方案的第一步,用来对数据库服务器当前运行的工作进行鉴定标识。可以使用很多方法来标识数据库活动,举个例子,你可以通过谁提交的工作来标识数据库活动,也可以通过其他方法来标识数据库活动。在标识阶段有两个相关的概念,分别是:
工作负载(WORKLOAD)
工作负载(WORKLOAD)通过工作所在的数据库连接属性来标识数据库活动。工作负载(WORKLOAD)是用来分配工作给服务类(Service Class)的方法,是一个根据工作的来源(source)标识区分工作的对象,以方便随后对工作进行相应的管理。来源(source)是由工作所在的数据库连接的属性决定的。
需要注意的是,此处所说的工作负载(WORKLOAD)和设计顾问程序等中所述的工作负载不是一个概念,设计顾问程序等中的工作负载就是数据库管理器必须在给定时间段内处理的一组 SQL 语句,而此处所讲的工作负载是指根据工作所在的数据库连接属性定义的逻辑分类。
工作类(WORK CLASS)和工作类集(WORK CLASS SET)
除了使用工作所在的数据库连接属性标识数据库活动以外,你还可以通过创建可选的工作类,通过基于工作的类型来标识数据库活动。这些类型属性可以是 READ , WRITE , DML , DDL , LOAD , CALL ,ALL。
工作类集(WORK CLASS SET)是一组工作类的集合。为了让一个工作类生效,至少需要启用一个工作类上的工作操作(WORK ACTION)。
下面我们来看一下管理阶段(Management Stage)。管理阶段是工作负载管理解决方案的第二步。在鉴定了工作的类型后,接下是对这个工作的动态管理,你可以对这个工作分配资源或者进行严格控制。管理阶段包含保证完成你的目标的机制。和管理阶段相关的概念有三个概念,分别是:
服务类(SERVICE CLASSES)和服务子类(SERVICE SUBCLASSES)
服务类的目的是为工作运行定义一个执行环境,这个环境包含可用的资源和不同的执行阈值(阈值定义不包含在服务类定义中,而是在单独的阈值定义部分),当你定义一个工作负载时,你必须为之指定对应的服务类。如果你没有显式的定义工作负载,用户数据库请求会被认为是系统默认的工作负载,其对应的服务类是系统默认的用户服务类。所有的系统数据库请求,对应的都是默认系统服务类。
所有的数据库请求都是在服务类中执行的,并且在服务类中获得相应的资源。所有的连接都是映射到工作负载上的,所有的工作负载都是映射到服务类上的。针对服务类中资源分配的情况,可以定义相应的阈值,来进行限定。DB2 的服务类拥有两层结构:服务父类(Service Superclass)和服务子类(Service Subclass)。
当你使用服务类时,你可以通过控制这个服务类的一系列属性,使不同的工作具有不同的优先级。比如,你可以设置服务类中工作的 I/O 页预取优先级,设置服务类中所有代理的 CPU 优先级,你还可以通过不同类型的阈值控制服务类中工作所使用的资源。
阈值(THRESHOLD)
可以通过创建阈值的方式对服务类所使用的资源进行控制,阈值可以根据不同的类型进行创建。阈值提供一种方法,用来控制每种工作能够使用的资源数量。在工作负载管理(WLM)解决方案中,你可以使用阈值来防止系统过载或者资源被滥用现象的发生。通过阈值,你可以直接对特定的资源设置限定,当超过限定时,就会触发特定的动作。
工作操作(WORK ACTION)和工作操作集(WORK ACTION SET)
工作操作(WORK ACTION)是一个用来控制某一种类型工作所对应数据库活动的方法。简单的说就是,当数据库活动满足已经定义好的工作类(WORK CLASS)所涉及的范围时,就会触发相应的工作操作(WORK ACTION)。
下面我们来看一下最后一个阶段,也就是监控阶段(Monitoring Stage)。监视的主要目的是确定你的系统和独立运行的工作负载是否健康和高效。通过表函数,你可以访问实时操作的数据(比如服务类中正在运行的工作负载和数据库活动的列表或者平均响应时间的列表)。作为实时监控的补充,为了历史分析,还通过使用事件监控器捕获数据库活动信息的细节和数据库活动统计信息。
总的来说,工作负载管理(WLM)有两种方式对工作进行管理,即一种主要的方式,一种补充的方式。主要的方式是通过工作负载(Workload)、服务类(Service Classs )和阈值(Threshold)相结合的方式,根据数据库行为的来源(数据库连接属性)对工作进行管理。补充的方式是通过工作类集(Work Class Set)和工作操作集(Work Action Set)相结合,根据数据库行为的属性对工作进行管理。补充的方式是在主要的管理方式基础之上进行的,不是单独进行管理的,也就是说,主要的管理方式一定会生效,如果定义了补充的方式,则补充的方式也同时生效。
所有的工作都将通过工作负载(Workload)、服务类(Service Classs )和阈值(Threshold)相结合的方式,根据数据库行为的来源(数据库连接属性)对工作进行管理。所有的工作都有对应的工作负载,当你定义一个工作负载时,你必须为之指定对应的服务类。如果你没有显式的定义工作负载,用户数据库请求会被认为是系统默认的工作负载,其对应的服务类是系统默认的用户服务类。所有的系统数据库请求,对应的都是默认系统服务类。所有的数据库请求都是在服务类中执行的,并且在服务类中获得相应的资源。可以通过创建阈值的方式对服务类所使用的资源进行控制,阈值可以根据不同的类型进行创建。
补充的方式(通过工作类集(Work Class Set)和工作操作集(Work Action Set)相结合,根据数据库行为的属性对工作进行管理)还将在主要的工作负载管理方式之上,根据数据库的行为,比如是 READ 还是 WRITE,定义工作类,当满足工作类定义时,就将触发相应的工作操作。
具体介绍如下:
工作负载(Workload)、服务类(Service Classs )和阈值(Threshold)
可以根据数据库连接的各种属性对具体的工作进行分类,定义成工作负载(Workload),定义工作负载时指定要匹配的服务类(Service Classs ),然后通过控制服务类的一系列属性,可以使不同的工作具有不同的优先级。比如,你可以设置服务类中工作的 I/O 页预取优先级,设置服务类中所有代理的 CPU 优先级,你还可以通过不同类型的阈值控制服务类中工作所使用的资源。另外,还可以使用阈值对服务类所使用的资源进行控制,阈值可以根据不同的类型进行创建。阈值提供一种方法,用来控制每种工作能够使用的资源数量。在工作负载管理(WLM)解决方案中,你可以使用阈值来防止系统过载或者资源被滥用现象的发生。通过阈值,你可以直接对特定的资源设置限定,当超过限定时,就会触发特定的动作。
工作类集(Work Class Set)和工作操作集(Work Action Set)
还可以根据数据库行为的属性对工作进行分类,比如根据 SQL 语句是 READ 和 WRITE 等定义不同的工作类集,当数据库活动满足已经定义好的工作类(WORK CLASS)所涉及的范围时,就会触发相应的工作操作(WORK ACTION)。
由于工作负载管理(WLM)是 DB2 V9.5 的新特性,很多客户不知道该如何使用,本文将重点介绍 DB2 V9.5 关于工作负载管理(WLM)的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。
我们将按照下列顺序介绍工作负载管理(WLM)以及相关的功能
安装 DB2 V9.5 ESE,通过创建示例数据库 DB2TEST1,构建演示环境,创建示例表 "RHETTE "." PROJECT ",并插入演示数据,创建演示用户。
介绍服务类(SERVICE CLASS)的具体知识,并通过创建 2 个服务类的例子来帮助大家理解。
介绍工作负载(WORKLOAD)的具体知识,并通过创建 2 个工作负载的例子来帮助大家理解。
介绍阈值(THRESHOLD)的具体知识,并通过创建 2 个阈值的例子来帮助大家理解。
介绍如何取消一个数据库活动。
介绍工作类(WORK CLASS)和工作操作(WORK ACTION)的具体知识,并通过例子来帮助大家理解。
总结工作负载管理(WLM)的优点。
IBM 的 DB2 V9.5 引入并完善了工作负载管理(WORKLOAD MANAGEMENT)功能,使得我们可以更深入地洞察系统的运行情况并更好地控制资源和性能。在 DB2 V9.5 中,新引入的工作负载管理功能(WLM)可以帮助您标识、管理和监视数据服务器的工作负载。本文将重点介绍 DB2 V9.5 关于工作负载管理(WLM)的新特性以及相关的概念,并结合实际的例子帮助大家理解和提高。
构建数据库环境
首先我们在 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 CREATEDATABASEDB2TEST1 USING CODESET GBK TERRITORY CN COLLATE
USING SYSTEM PAGESIZE 4096 DB20000I CREATEDATABASE命令成功完成。
命令执行成功,这样我们创建了一个示例数据库 DB2TEST1。继续在这个 DB2CLP 窗口中发出 GET DB CFG 命令,查看示例数据库 DB2TEST1 的配置参数,我们可以看到数据库地域是 CN,数据库代码页被设置成了 1386,数据库代码集被设置成了 GBK。另外,在 DB2 V9.5 新增了几个参数,分别是数字兼容性、Varchar2 兼容性、十进制浮点舍入方式、启用 XML 字符操作和 WLM 收集时间间隔(分钟),这些参数的具体信息可以查看 DB2 信息中心。查看示例数据库 DB2TEST1 配置参数的详细情况请参见清单 2 所示:
清单 2. 查看示例数据库 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 数据库共享内存大小(4KB) ( DATABASE_MEMORY ) =AUTOMATIC
数据库内存阈值 ( DB_MEM_THRESH ) =10 锁定列表的最大存储量(4KB) ( LOCKLIST ) =AUTOMATIC
每个应用程序的锁定百分比列表 ( MAXLOCKS ) =AUTOMATIC
程序包高速缓存大小(4KB) ( PCKCACHESZ ) =AUTOMATIC
共享排序的排序堆域值(4KB) ( SHEAPTHRES_SHR ) =AUTOMATIC
排序列表堆(4KB) ( 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~1IBMSQLLIB~1"中。
我们在操作系统中存在两个用户,分别是 RHETTE,和 DB2ADMIN,密码都是 passw0rd。我们使用RHETTE 用户在 DB2CLP 窗口中连上示例数据库 DB2TEST1,执行带有 CREATE TABLE 语句的脚本 project.sql,创建示例表 PROJECT,具体如清单 4 所示:
清单 4 . 创建示例表 PROJECT
数据库连接信息
数据库服务器=DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 -tvf project.sql
CREATETABLE"RHETTE"."PROJECT" ( "PROJNO" CHAR( 6) NOTNULL,
"PROJNAME" VARCHAR( 24) NOTNULLWITHDEFAULT'', "DEPTNO" CHAR( 3) NOTNULL,
"RESPEMP" CHAR( 6) NOTNULL, "PRSTAFF" DECIMAL( 5, 2) , "PRSTDATE" DATE ,
"PRENDATE" DATE , "MAJPROJ" CHAR( 6) ) IN"USERSPACE1"
DB20000I SQL命令成功完成。
ALTERTABLE"RHETTE"."PROJECT" ADDCONSTRAINT"PK_PROJECT" PRIMARYKEY( "PROJNO" )
DB20000I SQL命令成功完成。
CREATEINDEX"RHETTE"."XPROJ2" ON"RHETTE"."PROJECT" ( "RESPEMP" ASC)
ALLOW REVERSESCANS
DB20000I SQL命令成功完成。
继续在 DB2CLP 窗口中插入测试数据,然后发出 SELECT 语句,我们可以看到这些数据,具体如清单 5 所示:
清单 5 . 插入数据到示例表 PROJECT 中
C:>DB2 select*fromproject
PROJNO PROJNAME DEPTNO RESPEMP PRSTAFF PRSTDATE PRENDATE MAJPROJ
------------------------------------------ AD3100 ADMIN SERVICES D01 0000106.502002-01-012003-02-01- AD3110 GENERAL ADMIN SYSTEMS D21 0000706.002002-01-012003-02-01 AD3100
AD3111 PAYROLL PROGRAMMING D21 0002302.002002-01-012003-02-01 AD3110
AD3112 PERSONNEL PROGRAMMING D21 0002501.002002-01-012003-02-01 AD3110
AD3113 ACCOUNT PROGRAMMING D21 0002702.002002-01-012003-02-01 AD3110
IF1000 QUERY SERVICES C01 0000302.002002-01-012003-02-01- IF2000 USEREDUCATION C01 0000301.002002-01-012003-02-01- MA2100 WELD LINE AUTOMATION D01 00001012.002002-01-012003-02-01- MA2110 W L PROGRAMMING D11 0000609.002002-01-012003-02-01 MA2100
MA2111 W L PROGRAM DESIGN D11 0002202.002002-01-011982-12-01 MA2110
MA2112 W L ROBOT DESIGN D11 0001503.002002-01-011982-12-01 MA2110
MA2113 W L PROD CONT PROGS D11 0001603.002002-02-151982-12-01 MA2110
OP1000 OPERATION SUPPORT E01 0000506.002002-01-012003-02-01- OP1010 OPERATION E11 0000905.002002-01-012003-02-01 OP1000
OP2000 GEN SYSTEMS SERVICES E01 0000505.002002-01-012003-02-01- OP2010 SYSTEMS SUPPORT E21 0001004.002002-01-012003-02-01 OP2000
OP2011 SCP SYSTEMS SUPPORT E21 0003201.002002-01-012003-02-01 OP2010
OP2012 APPLICATIONS SUPPORT E21 0003301.002002-01-012003-02-01 OP2010
OP2013 DB/DC SUPPORT E21 0003401.002002-01-012003-02-01 OP2010
PL2100 WELD LINE PLANNING B01 0000201.002002-01-012002-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
alterservice class subclass_rhette under super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 alterservice class subclass_DB2admin under super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 alterservice class super_class disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 dropservice class subclass_rhette under super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 dropservice class subclass_DB2admin under super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 dropservice class super_class
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "SUPER_CLASS "是一个未定义的名称。 SQLSTATE =42704 createservice class super_class
DB20000I SQL命令成功完成。
createservice class subclass_rhette under super_class agent priority
defaultprefetch priority defaultcollect activity data onallwithdetails
andvaluescollect aggregate activity data base collect aggregate request data base
DB20000I SQL命令成功完成。
createservice 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。
当这个参数设置成 DEFAULT 以外的值时,代理真正的优先级将是正常优先级加上 AGENT PRIORITY,并将在下次动作时生效。比如,如果正常的优先级是 20,并且我们把这个参数设置成 6,那么服务类中的代理的优先级是 20+6=26.
当服务父类的代理优先级设成 default 时,那么这个服务父类中的代理将按照和操作系统调度 DB2 线程一样的优先级进行调度。当服务子类的代理优先级设成 default 时,服务子类继承服务父类的进程优先级。默认的服务子类的代理优先级不能进行修改。
在 Linux 和 UNIX 平台,integer-constant 的值可以是 -20 到 20(值越小代表的优先级越高),在windows 平台,integer-constant 的值可以是 -6 到 6(值越小代表的优先级月低)。
PREFETCH PRIORITY
你可以使用这个参数来控制服务类中代理的预取优先级。可选的值有 high, medium, low. 当你设置了这个参数,服务类中的代理对应的预取顺序在下次将按照你设置的值进行。如果你在一个预取请求提交后再修改这个参数的值,那么这个预取请求将不受新的设置参数值映像。
DEFAULT :对一个数据库服务父类来说,默认的值是 medium 预取顺序。当你对数据库服务子类指定默认值时,服务子类将继承相应的服务父类的预取优先级。
HIGH :把预取优先级设成高的。
MEDIUM :把预取优先级设成中的。
LOW :把预取优先级设成低的。
COLLECT ACTIVITY DATA
指定当动作完成后服务类中执行的每个动作信息都发送到相应的事件监控器中。默认值是 COLLECT ACTIVITY DATA NONE。COLLECT ACTIVITY DATA 子句只适用于服务子类。
NONE :指定将不收集这个服务类中执行每个动作信息。
ON COORDINATOR DATABASE PARTITION: 指定只收集动作所在数据库分区上的动作数据。
ON ALL DATABASE PARTITIONS : 指定收集所有数据库分区上的动作数据。但是,动作细节和值还是只在动作所在的数据库分区上收集。
WITHOUT DETAILS : 指定语句和编译环境不发送给事件监控器。
WITH DETAILS : 指定将语句和编译环境发送给事件监控器。
AND VALUES : 指定把动作相关的输入数据值发送给相应的事件监控器。
COLLECT AGGREGATE ACTIVITY DATA
指定捕获这个服务类相关的 aggregate activity data 并发送给相应的事件监控器。这些信息将被定期收集,收集的频率受工作负载管理收集时间间隔配置参数 (wlm_collect_int) 数据库配置参数控制。默认值是 COLLECT AGGREGATE ACTIVITY DATA NONE. COLLECT AGGREGATE ACTIVITY DATA 子句只适用于服务子类。
BASE : 指定这个服务类的基本 aggregate activity data 将被捕获并发送给相应的事件监控器。
EXTENDED : 指定这个服务类的所有 aggregate activity data 将被捕获并发送给相应的事件监控器。
NONE : 指定将不捕获这个服务类的 aggregate activity data 。
COLLECT AGGREGATE REQUEST DATA
指定捕获这个服务类相关的 aggregate request data 并发送给相应的事件监控器。这些信息将被定期收集,收集的频率受工作负载管理收集时间间隔配置参数 (wlm_collect_int) 数据库配置参数控制。 默认值是COLLECT AGGREGATE ACTIVITY DATA NONE。 COLLECT AGGREGATE ACTIVITY DATA 子句只适用于服务子类。
BASE :指定这个服务类的基本 aggregate request data 将被捕获并发送给相应的事件监控器。
NONE :指定将不捕获这个服务类的 aggregate request data 。
工作负载管理收集时间间隔配置参数(wlm_collect_int)
此参数指定工作负载管理(WLM)统计信息的收集和复位时间间隔(以分钟为单位)。
每隔 x wlm_collect_int 分钟(其中 x 是 wlm_collect_int 参数的值),就会收集所有工作负载管理统计信息并将它们发送至任何活动统计信息事件监视器,然后复位统计信息。如果存在活动事件监视器,那么将根据该事件监视器的创建方式,将统计信息写入文件或表。如果它不存在,那么将只复位统计信息,而不进行收集。
可以使用统计信息事件监视器收集的工作负载管理统计信息来监视短期和长期系统行为。由于可以将结果合并在一起来获得长期行为,所以可以使用较小的时间间隔来同时获得短期系统行为和长期系统行为。但是,由于必须手动合并不同时间间隔中的结果,这将使分析变得复杂。如果不需要手动合并结果,那么较小的时间间隔会导致不必要的开销增大。因此,减小时间间隔以捕获较短期的行为,并且在只分析长期行为就已足够的情况下,增大时间间隔以减少开销。
需要对每个数据库定制时间间隔,而不是对每个 SQL 请求、命令调用或应用程序进行定制。没有其他配置参数需要考虑。
注: 所有 WLM 统计信息表函数都返回自上次复位统计信息以来累积的统计信息。将按此配置参数指定的时间间隔定期复位统计信息。
需要注意的是,默认的服务子类 SYSDEFAULTSUBCLASS,自动为每个服务父类自动创建一个。我们可以通过系统视图 SYSCAT.SERVICECLASSES,或者通过 DB2pd 加 –serviceclasses 选项进行查看定义的服务类。
继续在 DB2CLP 窗口中,发出 DB2PD 命令,查看我们创建的服务类情况,我们可以看到服务父类SUPER_CLASS,服务子类 SUBCLASS_RHETTE、SUBCLASS_DB2ADMIN,以及默认创建的服务子类SYSDEFAULTSUBCLASS,具体如清单7所示:
清单 7 . 查看窗口的服务类
DatabasePartition 0--DatabaseDB2TEST1 --Active --Up 0days 06: 26: 15 Service Classes:
. . . . . . . . . .
Service Class Name =SUPER_CLASS
Service Class ID =14 Service Class Type =Service Superclass
DefaultSubclass ID =15 Service Class State =Enabled
Agent Priority =Default Prefetch Priority =Default Outbound Correlator =None
WorkAction SetID =N/A
Collect Activity Opt =None
Num Connections =0 Last StatisticsReset Time =2007-12-2713:33:05.000000 Num Coordinator Connections =0 Coordinator Connections HWM =0 Associated Workload Occurrences ( WLO ) :
AppHandl [nod - index ]WL ID WLO ID UOW ID WLO State
Service Class Name =SYSDEFAULTSUBCLASS
Service Class ID =15 Service Class Type =Service Subclass
Parent Superclass ID =14 Service Class State =Enabled
Agent Priority =Default Prefetch Priority =Default Outbound Correlator =None
Collect Activity Opt =None
Collect Aggr Activity Opt =None
Collect Aggr Request Opt =None
Act Lifetime Histogram Template ID =1 Act Queue Time Histogram Template ID =1 Act ExecuteTime Histogram Template ID =1 Act Estimated Cost Histogram Template ID =1 Act Interarrival Time Histogram Template ID =1 Request ExecuteTime Histogram Template ID =1 Access Count=0 Last Stats Reset Time =2007-12-2713:33:05.000000 Activities HWM =0 Activities Completed =0 Activities Rejected =0 Activities Aborted =0 Associated Agents:
EDU ID AppHandl [nod-index ]WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
Service Class Name =SUBCLASS_RHETTE
Service Class ID =16 Service Class Type =Service Subclass
Parent Superclass ID =14 Service Class State =Enabled
Agent Priority =Default Prefetch Priority =Default Outbound Correlator =None
Collect Activity Opt =Onallpartitions withdetails andvalues Collect Aggr Activity Opt =Base
Collect Aggr Request Opt =Base
Act Lifetime Histogram Template ID =1 Act Queue Time Histogram Template ID =1 Act ExecuteTime Histogram Template ID =1 Act Estimated Cost Histogram Template ID =1 Act Interarrival Time Histogram Template ID =1 Request ExecuteTime Histogram Template ID =1 Access Count=0 Last Stats Reset Time =2007-12-2713:33:05.000000 Activities HWM =0 Activities Completed =0 Activities Rejected =0 Activities Aborted =0 Associated Agents:
EDU ID AppHandl [nod-index ]WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
Service Class Name =SUBCLASS_DB2ADMIN
Service Class ID =17 Service Class Type =Service Subclass
Parent Superclass ID =14 Service Class State =Enabled
Agent Priority =6 Prefetch Priority =High
Outbound Correlator =None
Collect Activity Opt =None
Collect Aggr Activity Opt =None
Collect Aggr Request Opt =None
Act Lifetime Histogram Template ID =1 Act Queue Time Histogram Template ID =1 Act ExecuteTime Histogram Template ID =1 Act Estimated Cost Histogram Template ID =1 Act Interarrival Time Histogram Template ID =1 Request ExecuteTime Histogram Template ID =1 Access Count=0 Last Stats Reset Time =2007-12-2713:33:05.000000 Activities HWM =0 Activities Completed =0 Activities Rejected =0 Activities Aborted =0 Associated Agents:
EDU ID AppHandl [nod-index ]WL ID WLO ID UOW ID Activity ID
Associated Non-agent threads:
PID TID Thread Name
我们也可以通过控制中心查看系统视图 SYSDEFAULTSUBCLASS,来看一下我们创建的服务类情况,具体如图 2 所示:
图 2 . 查看已定义的服务类
IBM DB2 V9.5 中,新引入的工作负载管理功能( WLM )可以帮助您标识、管理和监视数据服务器的工作负载。本文将通过示例介绍如何实现 DB2 V9.5 的工作负载管理( WLM )相关的功能。
工作负载( WORKLOAD )
工作负载( WORKLOAD )通过工作所在的数据库连接属性来标识数据库活动。工作负载( WORKLOAD )是用来分配工作给服务类( Service Class )的方法,是一个根据工作的来源( source )标识区分工作的对象,以方便随后对工作进行相应的管理。来源( source )是由工作所在的数据库连接的属性决定的。
当服务器收到多个用户请求,首先将对用户请求进行评估标识(此时处于 WLM 第一阶段 标识阶段),当其数据库连接属性符合某个已经定义的工作负载,则将其分配给特定工作负载所在的服务类中执行。如果不能和已经定义的工作负载相匹配,则将用户请求分配给缺省用户工作负载所在的缺省用户服务类中执行。
当服务器收到系统请求时,将其分配给默认系统服务类中执行。
当服务器收到维护请求时,将其分配给默认维护服务类中执行。
默认系统服务类名为: SYSDEFAULTSYSTEMCLASS,其下有一个默认的服务子类: SYSDEFAULTSUBCLASS。
默认维护服务类名为:SYSDEFAULTMAINTENANCECLASS,其下有一个默认的服务子类:SYSDEFAULTSUBCLASS。
默认用户服务类名为:SYSDEFAULTUSERCLASS,其下有一个默认的服务子类:SYSDEFAULTSUBCLASS。
图 3 . 服务类和工作负载
接下来我们继续在刚才的 DB2CLP 窗口发出 ALTER WORKLOAD 命令,使工作负载 WL_RHETTE 和 WL_DB2ADMIN 失效。然后发出 DROP WORKLOAD 命令,删除工作负载 WL_RHETTE 和 WL_DB2ADMIN。最后发出 CREATE WORKLOAD 命令,创建工作负载工 WL_RHETTE 和 WL_DB2ADMIN。工作负载 WL_RHETTE 对应的服务子类是 subclass_rhette,对应的服务父类是 super_class。工作负载 WL_DB2ADMIN 对应的服务子类是 subclass_DB2admin,对应的服务父类是 super_class。需要注意的是,如果你想删除一个工作负载,那么必须先让该工作负载失效。具体如清单8所示:
清单 8 . 创建工作负载 WL_RHETTE 和 WL_DB2ADMIN
C:>DB2 -tvf wl_create.sql
alterworkload wl_rhette disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "WL_RHETTE "是一个未定义的名称。 SQLSTATE =42704 alterworkload wl_DB2admin disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "WL_DB2ADMIN "是一个未定义的名称。 SQLSTATE =42704 dropworkload wl_rhette
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "WL_RHETTE "是一个未定义的名称。 SQLSTATE =42704 dropworkload wl_DB2admin
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "WL_DB2ADMIN "是一个未定义的名称。 SQLSTATE =42704 createworkload wl_rhette session_user( 'RHETTE') service class subclass_rhette
under super_class
DB20000I SQL命令成功完成。
createworkload wl_DB2admin session_user( 'DB2ADMIN') service class subclass_DB2
admin under super_class
DB20000I SQL命令成功完成。
命令成功完成,工作负载是通过工作所在的数据库连接属性来标识数据库活动,数据库连接的属性可以是:
APPLNAME ( ' application - name ' , . . . )
为APPLNAME连接属性指定一个或多个应用程序名称。在列表中同一个应用程序名称不能出现多次,否则会报 SQLSTATE 42713 错误。应用程序名称是大小写敏感的,应用程序名称就是我们执行 LIST APPLICATIONS 命令显示的值。
SYSTEM_USER ( ' authorization – name ' , . . . )
为 SYSTEM USER 连接属性指定一个或多个授权 ID。在列表中同一个授权 ID 不能出现多次,否则会报 SQLSTATE 42713 错误。
SESSION_USER ( ' authorization – name ' , . . . )
为 SESSION USER 连接属性指定一个或多个授权 ID。需要注意的是,授权 ID 大小写敏感。在列表中同一个授权 ID 不能出现多次,否则会报 SQLSTATE 42713 错误。
SESSION_USER GROUP ( ' authorization – name ' , . . . )
为 SESSION_USER GROUP 连接属性指定一个或多个授权 ID。在列表中同一个授权 ID 不能出现多次,否则会报 SQLSTATE 42713 错误。
SESSION_USER ROLE ( ' authorization – name ' , . . . )
为 SESSION_USER ROLE 连接属性指定一个或多个授权 ID。这里会话授权ID的角色是指会话授权 ID 所有可用的角色,不管这些角色是怎么获得的。在列表中同一个授权 ID 不能出现多次,否则会报 SQLSTATE 42713 错误。
CURRENT CLIENT_USERID ( ' user – id ' , . . . )
为 CURRENT CLIENT_USERID 连接属性指定一个或多个客户端用户 ID。在列表中同一个客户端用户 ID 不能出现多次,否则会报 SQLSTATE 42713 错误。
CURRENT CLIENT_APPLNAME ( ' client – application – name ' , . . . )
为 CURRENT CLIENT_APPLNAME 连接属性指定一个或多个应用程序名称。在列表中同一个应用程序名称不能出现多次,否则会报 SQLSTATE 42713 错误。这个 client – application – name 是大小写敏感的,其值就是系统监控器输出中的 "TP Monitor client application name "值。
CURRENT CLIENT_WRKSTNNAME ( ' workstation – name ' , . . . )
为 CURRENT CLIENT_WRKSTNNAME 连接属性指定一个或多个客户端工作站名称。在列表中同一个客户端工作站名称不能出现多次,否则会报 SQLSTATE 42713 错误。
CURRENT CLIENT_ACCTNG ( ' accounting – string ' , . . . )
为 CURRENT CLIENT_ACCTNG 连接属性指定一个或多个 accounting string。在列表中同一个客户端 accounting string 不能出现多次,否则会报 SQLSTATE 42713 错误。
如果想查看已经定义的工作负载,可以通过查看系统视图 SYSCAT.WORKLOADS 的方式查看,也可以通过使用 DB2PD 工具进行查看,需要使用 DB2PD 工具的 workloads 选项。继续在当前 DB2CLP 窗口中,发出 DB2P 命令,部分输出信息如清单 9 所示:
清单 9 . 查看工作负载的定义情况
C:>DB2pd -workloads -db DB2test1
DatabasePartition 0--DatabaseDB2TEST1 --Active --Up 0days 15:58:51 Workload Definition :
Address WorkloadID WorkloadName DBAccess
0x7E69F2E03WL_RHETTE ALLOW
0x7E69F3844WL_DB2ADMIN ALLOW
0x7E69F4281SYSDEFAULTUSERWORKLOAD ALLOW
0x7E69F4C02SYSDEFAULTADMWORKLOAD ALLOW
Usage Privilege Holders :
Address WorkloadID Type AuthID
0x7E6877741GROUPPUBLIC Local Partition Workload Statistics:
Address WorkloadID WorkloadName NumWLO
0x7E6861C01SYSDEFAULTUSERWORKLOAD 1 0x7E688D602SYSDEFAULTADMWORKLOAD 0 0x7E69F1503WL_RHETTE 0 0x7E6860704WL_DB2ADMIN 0
我们也可以通过控制中心查看系统视图 SYSCAT.WORKLOADS,来看一下我们创建的工作负载情况,具体如图4所示:
图 4. 查看工作负载情况
对特定的工作负载(和一个特定的连接相关联)来说,其会话用户必须具有该工作负载的 USAGE 特权,如果想查看工作负载相关的 USAGE 特权,可以访问系统视图 SYSCAT.WORKLOADAUTH。我们继续在当前的 DB2CLP 窗口中,发出 GRANT 命令,把工作负载 WL_RHETTE 和 WL_DB2ADMIN 的 USAGE 特权赋给 PUBLIC 组,具体如清单 10 所示:
清单 10 . 把工作负载 USAGE 权限分配给 PUBLIC 组
C:>DB2 grantusage onworkload WL_RHETTE topublic DB20000I SQL命令成功完成。
C:>DB2 grantusage onworkload WL_DB2ADMIN topublic DB20000I SQL命令成功完成。
下面我们来看一下数据库连接、工作负载和服务类在具体的场景中是什么样子。
首先,我们关闭当前的 DB2CLP 窗口,再打开三个新的 DB2CLP 窗口,这样我们就有三个 DB2CLP 窗口,分别称之为窗口1、窗口2、窗口3。在窗口1中,我们发出 DB2 CONNECT 命令,连上示例数据库 DB2TEST1,用户名为 admnistrator,具体如清单 11 所示:
清单 11 . 在窗口 1 中使用 admnistrator 用户连接数据库
C:>DB2 connect toDB2test1 useradministrator using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =ADMINIST . . .
本地数据库别名 =DB2TEST1
命令成功完成,下面我们在窗口 2 中使用 RHETTE 用户连接示例数据库 DB2TEST1,并执行 SELECT 语句访问示例表 PROJEC,做一个查询量小的查询(用 PROJECT 表外连接自己),具体如清单 12 所示:
清单 12 . 在窗口 2 中使用 RHETTE 用户连接数据库
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromproject , project , project
1 -------------------------- 8000 1条记录已选择。
命令成功完成,下面我们在窗口 3 中用 DB2ADMIN 用户连接示例数据库 DB2TEST1,并执行 SELECT 语句访问示例表 PROJEC,做一个查询量小的查询(用 PROJECT 表外连接自己),具体如清单 13 所示:
清单13 . 在窗口 2 中使用 DB2ADMIN 用户连接数据库
C:>DB2 connect toDB2test1 userDB2admin using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =DB2ADMIN
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromrhette.project , rhette.project , rhette.project
1 -------------------------- 8000 1条记录已选择。
命令执行成功,下面我们回到窗口 1,通过访问表函数 wlm_get_service_class_workload_occurrences 来获取当前发生的工作负载列表,在返回的结果集中,还将返回这些工作负载的一些相关信息,比如其所在的服务子类、服务父类等,具体如清单 14 所示:
清单 14 . 在窗口 1 中查看当前发生的工作负载( workload )
C:>DB2 selectsubstr ( session_auth_id , 1, 8) asuser,
substr ( char( application_handle ) , 1, 7) asapphndl,
substr ( workload_name , 1, 24) asworkload_name ,
substr ( service_superclass_name , 1, 19) assuperclass_name ,
substr ( service_subclass_name , 1, 18) assubclass_name ,
substr ( char( workload_occurrence_id ) , 1, 6) aswlo_id ,
uow_id from table( wlm_get_service_class_workload_occurrences ( cast( nullasvarchar( 128) ) ,
cast( nullas varchar( 128) ) , -2) ) asscinfo
USERAPPHNDL WORKLOAD_NAME SUPERCLASS_NAME
SUBCLASS_NAME WLO_ID UOW_ID
-------------------------------------------- ADMINIST 580SYSDEFAULTUSERWORKLOAD SYSDEFAULTUSERCLASS
SYSDEFAULTSUBCLASS 12 RHETTE 599WL_RHETTE SUPER_CLASS
SUBCLASS_RHETTE 12 DB2ADMIN 600WL_DB2ADMIN SUPER_CLASS
SUBCLASS_DB2ADMIN 14 3条记录已选择。
命令成功完成,在返回结果中可以看到,当前存在 3 个工作负载。
窗口 1 中 ADMINISTRATOR 用户所在的数据库连接,对应的工作负载是系统默认用户工作负载 SYSDEFAULTUSERWORKLOAD,默认用户工作负载所对应的服务子类是默认用户服务子类 SYSDEFAULTSUBCLASS,默认用户工作负载所对应的服务子类是默认用户服务父类 SYSDEFAULTUSERCLASS。
窗口 2 中 RHETTE 用户所在的数据库连接,对应的工作负载是我们开始的时候在清单 8 中定义的工作负载 WL_RHETTE,该工作负载所对应的服务子类是 SUBCLASS_RHETTE,该工作负载所对应的服务父类是 SUPER_CLASS。
窗口 3 中 DB2ADMIN 用户所在的数据库连接,对应的工作负载是我们开始的时候在清单 8 中定义的工作负载 WL_DB2ADMIN ,该工作负载所对应的服务子类是 SUBCLASS_DB2ADMIN,该工作负载所对应的服务父类是 SUPER_CLASS。
下面我看一下同样的查询在不同的工作负载下执行速度有什么样的差别。大家还记得我们在清单 6 中定义的服务子类 SUBCLASS_RHETTE 和 SUBCLASS_DB2ADMIN,对其代理优先级(也就是使用 CPU资源的优先级)做了不同的定义,服务子类 SUBCLASS_RHETTE 对应的代理优先级是 DEFAULT,服务子类 SUBCLASS_DB2ADMIN 的代理优先级是 6。
当服务子类的代理优先级设成 DEFAULT 时,服务子类继承服务父类的进程优先级。也就是说服务子类 SUBCLASS_RHETTE 继承服务父类 SUPER_CLASS 的代理优先级,而 SUPER_CLASS 的代理优先级也是 DEFAULT。当代理优先级设置为 DEFAULT 时,没有特殊的操作发生,服务类中的代理将按照所有的 DB2 线程一样的优先级进行调度。DEDAULT 对应的值是 -32768。
服务子类 SUBCLASS_DB2ADMIN 的代理优先级是 6,则意味这代理真正的优先级将是正常优先级加上 AGENT PRIORITY,并将在下次动作时生效。比如,如果正常的优先级是 20,并且我们把这个参数设置成 6,那么服务类中的代理的优先级是 20+6=26.
在 Windows 平台,优先级为负值则意味着优先级低,所以服务子类 SUBCLASS_DB2ADMIN 的代理优先级比服务子类 SUBCLASS_RHETTE 高。
在窗口 1、2、3 中都断开原有的数据库连接。然后在窗口 2 中,使用 RHETTE 用户连接示例数据库 DB2TEST1,在窗口 3 中,使用 RHETTE 用户连接示例数据库 DB2TEST1,然后在两个窗口中几乎同时执行如下语句:
DB2 select count ( * ) from rhette.project , rhette.project , rhette.project , rhette.project , rhette.project , rhette.project
可以发现窗口 2 和窗口 3 这条语句执行的时间也差不多。
但当我们在窗口 3 中用 DB2ADMIN 连接示例数据库 DB2TEST1 时,还是执行刚才的 SELECT 语句,就会发现窗口 3 比窗口 2 快很多,这是因为 DB2ADMIN 用户执行的语句所在的服务子类 SUBCLASS_DB2ADMIN 代理优先级高的原因。
如果想查看服务类或服务子类执行的次数,可以通过访问表函数 WLM_GET_SERVICE_SUBCLASS_STATS 来查看,比如我们在窗口 1 中发出如下命令,具体如清单 15 所示:
清单 15 . 在窗口 1 中查看服务类或服务子类执行的次数
C:>DB2 selectsubstr ( service_superclass_name , 1, 19) assuperclass_name ,
substr ( service_subclass_name , 1, 18) assubclass_name ,
substr ( char( dbpartitionnum ) , 1, 4) aspart , concurrent_act_top asacttop ,
coord_act_completed_total ascompleted from table( WLM_GET_SERVICE_SUBCLASS_STATS ( cast( nullasVARCHAR( 128) ) ,
cast( nullasVARCHAR( 128) ) , -2) ) asscstats orderbysuperclass_name ,
subclass_name , part
SUPERCLASS_NAME SUBCLASS_NAME PART ACTTOP COMPLETED
--------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUPER_CLASS SUBCLASS_DB2ADMIN 011 SUPER_CLASS SUBCLASS_RHETTE 014 SUPER_CLASS SYSDEFAULTSUBCLASS 000 SYSDEFAULTMAINTENAN SYSDEFAULTSUBCLASS 000 SYSDEFAULTSYSTEMCLA SYSDEFAULTSUBCLASS 000 SYSDEFAULTUSERCLASS SYSDEFAULTSUBCLASS 015 6条记录已选择。
命令执行成功,关于表函数 WLM_GET_SERVICE_SUBCLASS_STATS 更多的信息可以查看 DB2 V9.5 信息中心。另外,还可以通过访问表函数 WLM_GET_WORKLOAD_STATS 来查看多少工作负载完成、失败或者被拒绝,比如我们在窗口 1 中发出如清单 16 所示的语句:
清单 16 . 在窗口 1 中查看工作负载的执行情况
C:>DB2 selectsubstr ( workload_name , 1, 24) aswl_def_name,
concurrent_wlo_top aswlo_top, concurrent_wlo_act_top aswlo_act_top ,
int( coord_act_completed_total ) ascompleted,
int( coord_act_aborted_total ) asaborted,
int( coord_act_rejected_total ) asrejected
fromtable( WLM_GET_WORKLOAD_STATS ( cast( nullasvarchar( 128) ) , -2) )
aswlstats orderbywl_def_name
WL_DEF_NAME WLO_TOP WLO_ACT_TOP COMPLETED ABORTED REJECTED
--------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SYSDEFAULTADMWORKLOAD 00000 SYSDEFAULTUSERWORKLOAD 11600 WL_DB2ADMIN 11120 WL_RHETTE 11420 4条记录已选择。
在 DB2 V9.5 中,新引入的工作负载管理功能( WLM )可以帮助您标识、管理和监视数据服务器的工作负载。本文将重点介绍 DB2 V9.5 关于工作负载管理(WLM)的阈值(THRESHOLD)设置相关的概念,并结合实际的例子帮助大家理解和提高。
阈值( THRESHOLD )
可以通过创建阈值的方式对服务类所使用的资源进行控制,阈值可以根据不同的类型进行创建。阈值提供一种方法,用来控制每种工作能够使用的资源数量。在工作负载管理( WLM )解决方案中,你可以使用阈值来防止系统过载或者资源被滥用现象的发生。通过阈值,你可以直接对特定的资源设置限定,当超过限定时,就会触发特定的动作。
支持的动作有:
STOP EXECUTION:停止违反阈值的相关动作
CONTINUE:继续执行
收集违反阈值的相关动作信息
不管违反阈值的特定动作被停止还是继续执行,你都可以收集该动作的详细信息。当特定动作完成后,其相关信息会被活动的 ACTIVITIES 事件监控器收集到。
每个阈值都有一个应用范围。阈值的作用域定义其可以操作的数据库对象。只有在该阈值范围内发生的动作才会受其影响。阈值的作用域可以是:
数据库(Database)
服务父类(Service superclass )
服务子类(Service subclass )
工作动作(Work action )
工作负载(Workload )
阈值即可以是 predictive ,也可以是 reactive,也就是说,我们可以定义阈值是前触发还是后触发
前触发阈值是在相应的工作开始之前进行检查。数据服务器通过 SQL 编译器得到使用资源的估计值,检查前触发阈值是否会被触发。
后触发阈值是在相应的工作开始之后进行检查的。通过对控制资源的大体运行时间使用估计,来评估是否达到了后触发阈值的边界。运行时间使用估计不是连续获得的,而是在每个(特定工作生命周期中)预先选择的检查点进行获取。
需要注意的是,阈值不是适合所有的语句,比如,阈值不能应用在 COMMIT, ROLLBACK, AVEPOINT 以及 ROLLBACK to SAVEPOINT 等。
你可以使用 CREATE THRESHOLD 创建阈值,使用 ALTER THRESHOLD 修改阈值,还可以使用 DROP THRESHOLD 删除阈值。如果想查询你定义的阈值,可以查询 SYSCAT.THRESHOLDS 系统视图。
下面我们继续在窗口 1 中来创建一个阈值,来限制包含大的查询的服务类,阈值的范围是整个数据库,阈值的边界是当 ESTIMATEDSQLCOST 大于 100000,ESTIMATEDSQLCOST 能够返回优化器分配给 DML 语句相关活动成本的估计值,具体如清单 17 所示:
清单 17 . 在窗口 1 中创建一个阈值,限制包含大查询的服务类
C:>DB2 connect toDB2test1 useradministrator using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =ADMINIST . . .
本地数据库别名 =DB2TEST1
C:>DB2 -tvf createthreshold.sql
ALTERTHRESHOLD LargeQuery DISABLE
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "LARGEQUERY "是一个未定义的名称。 SQLSTATE =42704 DROPTHRESHOLD LargeQuery
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "LARGEQUERY "是一个未定义的名称。 SQLSTATE =42704 CREATETHRESHOLD LargeQuery FORservice class SUPER_CLASS ACTIVITIES
ENFORCEMENT DATABASEWHENESTIMATEDSQLCOST >100000STOP EXECUTION
DB20000I SQL命令成功完成。
继续在窗口 2 中执行一个大的查询(此时我们的用户是 RHETTE,如果执行查询,该查询会属于 SUPER_CLASS 服务类),这时我们会收到“ SQL4712N 已超过阈值 ‘ LARGEQUERY ’。原因码 = ‘7’。 SQLSTATE = 5U026”的错误信息,这是因为我们执行的查询超过了我们预先定义的边界,具体如清单 18 所示:
清单 18 . 在窗口 2 中执行一个大型查询
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromproject , project , project , project , project ,
project
SQL4712N 已超过阈值 "LARGEQUERY "。原因码 ="7"。 SQLSTATE =5U026
接下来我们创建一个新的阈值,用来限制同一条 SQL,并发执行数大于 1,我们继续在窗口 1 中发出 CREATE THRESHOLD 语句,创建新的阈值 MYCUNCURRENT,阈值范围是整个数据库,阈值的边界 CONCURRENTDBCOORDACTIVITIES 大于 1。CONCURRENTDBCOORDACTIVITIES 用来表示某个特定动作的并发执行数。具体如清单 19 所示:
清单 19 . 在窗口 1 中创建一个阈值,限制并发执行数
C:>DB2 -tvf crtThresCurrency.sql
ALTERTHRESHOLD MYCUNCURRENT DISABLE
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "MYCUNCURRENT "是一个未定义的名称。 SQLSTATE =42704 DROPTHRESHOLD MYCUNCURRENT
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "MYCUNCURRENT "是一个未定义的名称。 SQLSTATE =42704 CREATETHRESHOLD MYCUNCURRENT FORSERVICE CLASS subclass_DB2admin
UNDER super_class ACTIVITIES ENFORCEMENT DATABASEWHENCONCURRENTDBCOORDACTIVITIES >1 STOP EXECUTION
DB20000I SQL命令成功完成。
命令成功完成。我们继续在窗口 2 中用 DB2ADMIN 用户连上示例数据库 DB2TEST1,具体如清单 20 所示:
清单 20 . 在窗口 2 中执行一个简单查询
C:>DB2 connect reset
DB20000I SQL命令成功完成。
C:>DB2 connect toDB2test1 userDB2admin using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =DB2ADMIN
本地数据库别名 =DB2TEST1
命令成功完成。我们继续在窗口 3 中用 DB2ADMIN 用户连上示例数据库 DB2TEST1,基本上同时在窗口 2 和窗口 3 执行一个同样的查询,会发现窗口 2 执行成功,窗口3执行失败,报“ SQL4712N 已超过阈值 ‘MYCUNCURRENT’。原因码 = ‘6"。 ’SQLSTATE = 5U026”错误,这是由于在窗口2执行完这条语句后,几乎同时在窗口 3 执行(此时窗口 2 中的查询还没完成),并发数为 2,超过了我们预定义的阈值边界。具体如清单 21 所示:
清单 21-1 . 在窗口 2 中执行一个简单查询
C:>DB2 selectcount( *) fromrhette.project , rhette.project , rhette.project ,
rhette.project , rhette.project
1 ---------------------- 3200000 1条记录已选择。
清单 21-2 . 在窗口 3 中执行同一个简单查询
C:>DB2 selectcount( *) fromrhette.project , rhette.project , rhette.project ,
rhette.project , rhette.project
SQL4712N 已超过阈值 "MYCUNCURRENT "。原因码 ="6"。 SQLSTATE =5U026
从上面两个例子我们可以看到,WHEN 后可以跟不同的阈值谓词( threshold-predicate ),阈值谓词用来指定阈值的条件,可以是以下选项:
TOTALDBPARTITIONCONNECTIONS >integer-value
这个条件定义了在一个数据库分区上可以同时运行的协调器( coordinator )连接的数量上限。条件值可以是任何正整数,包括零(如果违反,则会报 SQLSTATE 42820 )。零的意思是所有新的协调器连接将被阻止连接。所有当前运行或当前队列中的连接都将继续,不会被阻止。这个条件的定义域( definition domain )必须是数据库( DATABASE ),而且其执行范围( enforcement scope )必须是分区( PARTITION ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。
TOTALSCPARTITIONCONNECTIONS >integer-value
这个条件定义了在一个数据库分区上特定的服务父类中可以同时运行的协调器( coordinator )连接的数量上限。条件值可以是任何正整数,包括零(如果违反,则会报 SQLSTATE 42820 )。零的意思是新的连接将被阻止加入服务类中。所有当前运行或当前队列中的连接都将继续,不会被阻止。这个条件的定义域( definition domain )必须是服务父类( SERVICE SUPERCLASS ),而且其执行范围( enforcement scope )必须是分区( PARTITION ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。
AND QUEUEDCONNECTIONS >integer-value or AND QUEUEDCONNECTIONS UNBOUNDED
当允许的协调器连接最大值被超过时,用指定的队列大小(缓存这些连接)。条件值可以是任何正整数,包括零(如果违反,则会报 SQLSTATE 42820)。零的意思是没有协调器连接将被放入队列中。指定 UNBOUNDED,意味着将把所有超过协调器连接最大值的连接放入到队列中,并且 threshold-exceeded-actions 不会被执行。默认值是零。
CONNECTIONIDLETIME >integer-value (DAY | DAYS | HOUR | HOURS | MINUTE | MINUTES )
这个条件定义了数据库管理器允许一个连接保持空闲状态的时间上限。条件值可以是任何非零的正整数(如果违反,则会报 SQLSTATE 42820 )。使用一个合法的持续时间关键字,为 integer-value 指定适当的时间单位。这个条件的定义域( definition domain )必须是数据库( DATABASE )或服务父类( SERVICE SUPERCLASS ),而且其执行范围( enforcement scope )必须是数据库( DATABASE ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。这个条件将在协调器数据库分区上作为逻辑条件被强制执行。
因为这个阈值的最小粒度是五分钟,指定的值将围绕着五分钟的非零倍数。万一指定的值不是五分钟的非零倍数(超过或小于),那么将自动选择一个最接近五分钟非零倍数的整数值。这个阈值的最大值是 2 147 483 400 秒。任何指定的值(使用天、小时、分钟或者秒),如果其换算成秒的值大于 2 147 483 400 秒,则其将被截断为 2 147 483 400 秒。修改 DB2CHECKCLIENTINTERVAL 注册表变量引起检查频率变低可能会影响这个阈值的粒度。
CONCURRENTWORKLOADOCCURRENCES >integer-value
这个条件定义在每个数据库分区上运行的并发工作负载的数量上限。这个条件值可以被设成任何非零整数值(如果违反,则会报 SQLSTATE 42820 )。条件的定义域( definition domain )必须是 WORKLOAD,如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。
CONCURRENTWORKLOADACTIVITIES >integer-value
这个条件定义了每个数据库分区上工作负载的并发协调器活动和嵌套活动的数量上限。这个条件值可以是任何非零正整数值(如果违反,则会报 SQLSTATE 42820 )。条件的执行范围( enforcement scope )必须是 WORKLOAD OCCURRENCE,如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。
CONCURRENTDBCOORDACTIVITIES >integer-value
这个条件定义在所有的数据库分区上指定的作用域中可以并发运行的数据库协调器活动( database coordinator activities )的数量上限。条件值可以是任何正整数,包括零(如果违反,则会报 SQLSTATE 42820 )。零的意思是任何新的数据库协调器活动将被阻止执行。所有当前运行或当前队列中的数据库协调器活动都将继续,不会被阻止。这个条件的定义域( definition domain )必须是数据库( DATABASE ),工作动作( WORK ACTION ),服务父类( SERVICE SUPERCLASS ),或者服务子类( SERVICE SUBCLASS ),而且其执行范围( enforcement scope )必须是数据库( DATABASE ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。
AND QUEUEDACTIVITIES >integer-value or AND QUEUEDACTIVITIES UNBOUNDED
当允许的数据库协调器活动( database coordinator activities )最大值被超过时,用指定的队列大小(缓存这些数据库协调器活动)。条件值可以是任何正整数,包括零(如果违反,则会报 SQLSTATE 42820 )。零的意思是没有数据库协调器活动将被放入队列中。指定 UNBOUNDED,意味着将把所有超过数据库协调器活动最大值的活动放入到队列中,并且 threshold-exceeded-actions 不会被执行。默认值是零。
ESTIMATEDSQLCOST >bigint-value
这个条件定义了一个活动的优化器分配成本的上限。条件值可以是任何非零正整数(如果违反,则会报 SQLSTATE 42820)。这个条件的定义域( definition domain )必须是数据库( DATABASE ),工作动作( WORK ACTION ),服务父类( SERVICE SUPERCLASS ),或者服务子类( SERVICE SUBCLASS ),而且其执行范围( enforcement scope )必须是数据库( DATABASE ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。这个条件在协调器数据库分区上是被强制执行的。被这个条件跟踪的活动有:
DML协调器活动
那些被用户逻辑调用的嵌套DML活动。因此,那些可以被数据库管理器初始化的DML活动(比如,实用程序,存储过程,嵌入式 SQL 等)都不会被这个条件跟踪(除非他们的开支是被包含在他们的调用者评估上的,也就是间接被跟踪)。
SQLROWSRETURNED >integer-value
这个条件定义了返回给(应用服务器上的)应用客户端的行数上限。条件值可以是任何非零正整数(如果违反,则会报 SQLSTATE 42820 )。这个条件的定义域( definition domain )必须是数据库( DATABASE ),工作动作( WORK ACTION ),服务父类( SERVICE SUPERCLASS ),或者服务子类( SERVICE SUBCLASS ),而且其执行范围( enforcement scope )必须是数据库( DATABASE ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。这个条件在协调器数据库分区上是被强制执行的。被这个条件跟踪的活动有:
DML 协调器活动;
那些源自用户逻辑嵌套 DML 活动。因此,那些可以被数据库管理器初始化的 DML 活动(比如,实用程序,存储过程,嵌入式 SQL 等)都不会被这个条件跟踪。
在一个存储过程内部的返回结果集被分别视同为独立的活动。没有存储过程返回行数的集合限制。
ACTIVITYTOTALTIME >integer-value ( DAY | DAYS | HOUR | HOURS | MINUTE | MINUTES )
这个条件定义数据库管理器允许一个特定的活动执行的总时间上限,包括这个活动排队的时间。条件值可以是任何非零正整数(如果违反,则会报 SQLSTATE 42820 )。使用一个合法的持续时间关键字,为 integer-value 指定适当的时间单位。这个条件的定义域( definition domain )必须是数据库( DATABASE )或服务父类( SERVICE SUPERCLASS ),而且其执行范围( enforcement scope )必须是数据库( DATABASE ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。这个条件将在协调器数据库分区上作为逻辑条件被强制执行。
因为这个阈值的最小粒度是五分钟,指定的值将围绕着五分钟的非零倍数。万一指定的值不是五分钟的非零倍数(超过或小于),那么将自动选择一个最接近五分钟非零倍数的整数值。这个阈值的最大值是 2 147 483 400 秒。任何指定的值(使用天、小时、分钟或者秒),如果其换算成秒的值大于 2 147 483 400 秒,则其将被截断为 2 147 483 400 秒。修改 DB2CHECKCLIENTINTERVAL 注册表变量引起检查频率变低可能会影响这个阈值的粒度。
SQLTEMPSPACE >integer-value ( K | M | G )
这个条件定义在任何一个数据库分区上系统临时表空间的上限大小。条件值可以是任何非零正整数(如果违反,则会报 SQLSTATE 42820 )。
如果指定了 integer-value K (大小或小写) , 则最大值是 integer-value 乘以 1024;如果指定了 integer-value M (大小或小写) , 则最大值是 integer-value 乘以 1 048 576;如果指定了 integer-value G (大小或小写) , 则最大值是 integer-value 乘以 1 073 741 824。
这个条件的定义域( definition domain )必须是数据库( DATABASE )或服务父类( SERVICE SUPERCLASS ),而且其执行范围( enforcement scope )必须是分区( PARTITION ),如果违反了,将报 SQLSTATE 5U037 错误,阈值无法创建,因为它违反了限制。这个条件将在协调器数据库分区上作为逻辑条件被强制执行。以下活动将被这个条件跟踪:
DML 协调器活动和相应的子代理工作( subsection execution );
那些源自用户逻辑嵌套 DML 活动和他们相应的子代理工作( subsection execution )。因此,那些可以被数据库管理器初始化的 DML 活动(比如,实用程序,存储过程,嵌入式 SQL 等)都不会被这个条件跟踪。
最后,我们继续在窗口 1 删除刚才定义的两个阈值 MYCUNCURRENT 和 LargeQuery,同样的,在删除之前,需要先把阈值变成不可用。具体如清单 22 所示:
清单 22 . 在窗口 1 中删除阈值
C:>DB2 -tvf dropThresholds.sql
ALTERTHRESHOLD MYCUNCURRENT DISABLE
DB20000I SQL命令成功完成。
DROPTHRESHOLD MYCUNCURRENT
DB20000I SQL命令成功完成。
ALTERTHRESHOLD LargeQuery DISABLE
DB20000I SQL命令成功完成。
DROPTHRESHOLD LargeQuery
DB20000I SQL命令成功完成。
命令成功完成,这样我们就删除了刚才我们定义的两个阈值。
在 DB2 V9.5 中,新引入的工作负载管理功能( WLM )可以帮助您标识、管理和监视数据服务器的工作负载。本文将重点介绍 DB2 V9.5 工作负载管理( WLM )中的工作类( WORK CLASS )和工作操作( WORK ACTION )的相关概念,并结合实际的例子帮助大家理解和提高。
取消一个数据库活动
在我们生产系统中,可能存在一些正在运行的大 SQL,这些活动消耗了太多的资源。如果我们想停止这些正在执行的活动,可以调用 WLM_CANCEL_ACTIVITY() 存储过程,如果想捕获一个活动的详细信息可以调用 WLM_CAPTURE_ACTIVITY_IN_PROGRESS() 存储过程,如果想收集和重置一个工作负载对象的统计信息可以调用 WLM_COLLECT_STATS()。这些存储过程的具体信息如下:
WLM_CANCEL_ACTIVITY ( application_handle , uow_id , activity_id ) .
可以使用这个存储过程来取消一个正在运行或者正在排队的活动。对某个特定的活动来说,我们可以使用应用程序句柄、工作单元标识和活动标识来唯一标识。使用这个存储过程,我们可以取消任何类型的活动。当这个存储过程执行后,被取消的特定活动将收到 SQL4725N 的错误信息。
WLM_CAPTURE_ACTIVITY_IN_PROGRESS ( application_handle , uow_id , activity_id ) .
我们可以使用这个存储过程捕获特定活动的详细信息,并发送给活动事件监控器。这个存储过程会立即发送信息,而不是等待该活动完成再发送。
WLM_COLLECT_STATS ( ) .
使用这个存储过程可以用来收集和重置工作负载对象统计信息。所有跟踪收集的服务类、工作负载、阈值队列和工作动作集统计信息,都会发送给活动统计信息事件监控器(如果存在)并重置。如果没有活动统计信息事件监控器,那么统计信息将只重置,而不收集。
以上存储过程调用中需要的应用程序句柄( application_handle )、工作单元标识( uow_id )、活动标识( activity_id ),可以通过调用表函数 WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES 来获得。
我们继续在窗口 1 用 ADMINISTRATOR 用户连接示例数据库 DB2TEST1,在窗口 2 用 RHETTE 用户连接示例数据库 DB2TEST1,并在窗口 2 中执行一个大的查询,具体如清单 23 所示:
清单 23 . 在窗口 2 中执行一个大的查询
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器=DB2 /NT 9.5.0 SQL 授权标识 =DB2ADMIN
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromrhette.project , rhette.project , rhette.projec
t , rhette.project , rhette.project , rhette.project
在窗口 2 中的大型查询完成之前,在窗口 1 中调用表函数 WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES,来获得窗口 2 中正在进行的大型查询的应用程序句柄( application_handle )、工作单元标识( uow_id )、活动标识( activity_id )信息,在获得这些信息后,如果还想查看更详细的信息,可以根据应用程序句柄通过 LIST APPLICATIONS SHOW DETAIL 来查看。具体如清单 24 所示:
清单 24 . 在窗口 1 中调用表函数 WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES
C:>DB2 -tvf get_wkld_activities.txt
SELECTT.APPLICATION_HANDLE , T.UOW_ID , T.ACTIVITY_ID , T.ACTIVITY_TYPE ,
T.ACTIVITY_TYPE , T.ACTIVITY_STATE , T.LOCAL_START_TIME FROM TABLE( WLM_GET_WORKLOAD_OCCURRENCE_ACTIVITIES ( CAST( NULLASBIGINT) , -2) ) T
ORDERBYT.LOCAL_START_TIME
APPLICATION
_HANDLE UOW_ID ACTIVITY_ID ACTIVITY_TYPE ACTIVITY_STATE
LOCAL_START_TIME
--------------------------------------- 8071READ_DML EXECUTING
2008-01-02-17.01.25.306889 81101READ_DML EXECUTING
2008-01-02-17.01.32.253342 2条记录已选择。
接下来我们来看一下如何取消窗口 2 中正在进行的大型查询,在窗口 1 中调用 WLM_CANCEL_ACTIVITY 存储过程,输入参数使用在清单 24 中获得的应用程序句柄( application_handle )、工作单元标识( uow_id )、活动标识( activity_id ),具体如清单 25 所示:
清单25 . 在窗口 1 中调用 WLM_CANCEL_ACTIVITY 存储过程取消特定活动
C:>DB2 call WLM_CANCEL_ACTIVITY( 80, 7, 1)
返回状态 =0
此时窗口 2 中正在执行的大型查询会收到“ SQL4725N 已取消该活动。 SQLSTATE = 57014 ”的相关信息,具体如清单 26 所示:
清单 26 . 在窗口 2 中获得特定活动取消的相关信息
C:>DB2 selectcount( *) fromrhette.project , rhette.project , rhette.projec
t , rhette.project , rhette.project , rhette.project
1 ----------------- SQL4725N 已取消该活动。 SQLSTATE =57014
工作类( WORK CLASS )和工作操作( WORK ACTION )
除了使用工作所在的数据库连接属性标识数据库活动以外,你还可以通过创建可选的工作类,通过基于工作的类型来标识数据库活动。这些类型属性可以是 READ , WRITE , DML , DDL , LOAD , CALL ,ALL。工作类型属性具体的介绍如下:
READ
此属性对应的活动包括以下语句:
所有的 SELECT 或者 SELECT INTO 语句,并且语句中不包含 DELETE , INSERT , MERGE , UPDATE 语句;
所有的 VALUES INTO 语句;
所有的 XQuery 语句。
WRITE
此属性对应的活动包括以下语句:
所有的 UPDATE 语句;
所有的 DELETE 语句;
所有的 INSERT 语句;
所有的 MERGE 语句;
所有的包含 DELETE, INSERT, UPDATE 的SELECT 语句;
所有的 XQuery 语句。
CALL
此属性对应的活动包括所有的 CALL 语句。如果想让工作类包含一个 CALL 语句 ,其工作类型可以是 CALL 或者 ALL。
DML
所有在 READ 和 WRITE 中出现的语句都是 DML 语句。
DDL
此属性对应的活动包括以下语句:
所有的 ALTER 语句;
所有的 CREATE 语句;
所有的 COMMENT 语句;
所有的 DECLARE GLOBAL TEMPORARY TABLE 语句;
所有的 DROP 语句;
所有的 FLUSH PACKAGE CACHE 语句;
所有的 GRANT 语句;
所有的 REFRESH TABLE 语句;
所有的 RENAME 语句;
所有的 REVOKE 语句;
所有的 SET INTEGRITY 语句;
LOAD
此属性对应的活动包括所有的 LOAD 操作。
ALL
此属性对应的活动可以是以上属性中出现任意一个活动。
工作操作( WORK ACTION )是一个用来控制某一种类型工作所对应数据库活动的方法。简单的说就是,当数据库活动满足已经定义好的工作类( WORK CLASS )所涉及的范围时,就会触发相应的工作操作( WORK ACTION )。
下面我们在窗口 1 中,发出 CREATE WORK CLASS SET 命令,创建工作类集 myquery,其下包含三个工作类,分别是针对小型查询的 smallquery,针对中型查询的 mediumquery 以及针对大型查询的 largequery,工作类型都是 DML,具体如清单 27 所示:
清单 27 . 在窗口 1 中创建工作类集
C:>DB2 connect toDB2test1 useradministrator using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =ADMINIST . . .
本地数据库别名 =DB2TEST1
C:>DB2 -tvf crtWorkClassSet.sql
dropworkclass setmyquery
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N "MYQUERY "是一个未定义的名称。 SQLSTATE =42704 createworkclass setmyquery (
workclass smallQuery worktype dml
fortimeroncost from1to1000,
workclass mediumQuery worktype dml
fortimeroncost from1000to100000,
workclass largeQuery worktype dml
fortimeroncost from100000tounbounded )
DB20000I SQL命令成功完成。
命令成功完成,这样我们就创建了一个工作类集和三个工作类。工作类 smallQuery 包含的范围是:当一个特定的 DML 活动,其估计成本大于 1 timeron 且小于等于 1000 timerons。需要注意的是,成本是由 CPU成本(以指令数计)和 I/O(以寻道数和页的转换数计)的组合得出的。成本的单位是 timeron。timeron 不直接等于任何实际的所用时间,只是给出粗略估计的资源(成本)。工作类 mediumQuery 包含的范围是:当一个特定的 DML 活动,其估计成本大于 1000 timeron 且小于等于 100000 timerons。工作类 largeQuery 包含的范围是:当一个特定的 DML 活动,其估计成本大于 100000 timeron ,没有上限。
下面我们继续在窗口 1 中创建相应的工作动作集以及工作动作。发出 CREATE WORK ACTION SET 命令,创建工作动作集 MYWORKACTION,并创建面向工作类 smallQuery 的工作动作 smallQueryAction ,面向工作类 mediumQuery 的工作动作 mediumQueryAction,面向工作类 largeQuery 的工作动作 largeQueryAction,具体如清单 28 所示:
清单 28 . 在窗口 1 中创建工作动作集
C:>DB2 -tvf crtWorkActionSet.sql
alterworkaction setMYWORKACTION
altersmallQueryAction disable
altermediumQueryAction disable
alterlargeQueryAction disable
DB20000I SQL命令成功完成。
dropworkaction setMYWORKACTION
DB20000I SQL命令成功完成。
createworkaction setMYWORKACTION fordatabaseusing workclass setMYQUERY
( workaction smallQueryAction onworkclass smallQuery
countactivity,
workaction mediumQueryAction onworkclass mediumQuery
collect activity data withdetails andvalues,
workaction largeQueryAction onworkclass largeQuery
whenconcurrentdbcoordactivities >1andqueuedactivities >1stop execution )
DB20000I SQL命令成功完成。
命令成功完成。这样我们就创建了 1 个工作动作集和 3 个工作动作。
工作动作集 MYWORKACTION 对应的工作类集 MYQUERY。工作动作 smallQueryAction 对应的工作类是 smallQuery,且指定了 count activity 选项,含义是指定工作类 smallQuery 所对应的数据库活动,只要其任何一个在运行,则这个工作类的计数器就会累积增长。
工作动作 mediumQueryAction 对应的工作类是 mediumQuery,且指定了 collect activity data with details and values 选项,collect activity data 的含义是当工作类 mediumQuery 相关的每一个活动完成后,都将其数据发送给相关合适的事件监控器;with details 的含义是当相关的活动完成后,还要把相关的语句和编译环境发送给相关的时间监控器;and values 的含义是那些活动相关的输入数据值也发送给相关的事件监控器。
工作动作 largeQueryAction 对应的工作类是 largeQuery,且指定了 when concurrentdbcoordactivities >1 and queuedactivities >1 stop execution 选项,含义是当并发的数据库协调器活动( database coordinator activities )大于 1 时,数据库管理器将对活动进行排队,对后来的数据库协调器活动(比如一个查询)放入排队队列。并且当排队的活动也大于1时,数据库活动将不允许执行。
下面我们继续在窗口 2 中用 RHETTE 用户连接示例数据库 DB2TEST1,并执行两个查询,在窗口 3 中用 RHETTE 用户连接示例数据库 DB2TEST1 ,也执行两个相同的查询,然后在窗口 2 中通过调用表函数 WLM_GET_WORK_ACTION_SET_STATS ,查看工作动作集的状态,具体如清单 29 所示:
清单 29. 在窗口 2 中执行两个查询
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromproject , project , project
1 ---------------------- 8000 1条记录已选择。
C:>DB2 selectcount( *) fromproject , project , project , project , project
1 ---------------------- 3200000 1条记录已选择。
清单 30. 在窗口 3 中执行两个查询
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromproject , project , project
1 ---------------------- 8000 1条记录已选择。
C:>DB2 selectcount( *) fromproject , project , project , project , project , project
1 ---------------------- 64000000 1条记录已选择。
清单 31. 在窗口 2 中查看工作动作集的状态
C:>DB2 selectsubstr( work_action_set_name , 1, 18) aswork_action_set_name ,
substr ( char( dbpartitionnum ) , 1, 4) aspart ,
substr ( work_class_name , 1, 15) aswork_class_name , last_reset ,
substr ( char( act_total ) , 1, 14) astotal_wlo_acts from table( WLM_GET_WORK_ACTION_SET_STATS ( cast( nullasvarchar( 128) ) , -2) )
aswasstats orderbywork_action_set_name , work_class_name , part
WORK_ACTION_SET_NAME PART WORK_CLASS_NAME LAST_RESET TOTAL_WLO_ACTS
------------------------------------------- MYWORKACTION 0*2008-01-03-14.26.15.2937980 MYWORKACTION 0LARGEQUERY 2008-01-03-14.26.15.2937911 MYWORKACTION 0MEDIUMQUERY 2008-01-03-14.26.15.2937541 MYWORKACTION 0SMALLQUERY 2008-01-03-14.26.15.2937173 4条记录已选择。
命令成功完成。
接下来我们看一下如果同时在三个窗口执行同样的大型 SQL,会出现什么样的状况。首先在窗口 1 中执行一个大型查询 SQL,同时在窗口 2、3 也同时执行同样的大型 sql,在窗口 3 会报“ SQL4712N 已超过阈值 =‘SQL080103142608430’。原因码 = ‘6’。 SQLSTATE = 5U026”错误。窗口 1 和窗口 2 最终将查询出结果集来。具体如清单 30 所示:
清单 32. 在窗口 1 中执行大型查询
C:>DB2 connect toDB2test1 userrhette using passw0rd
数据库连接信息
数据库服务器 =DB2 /NT 9.5.0 SQL 授权标识 =RHETTE
本地数据库别名 =DB2TEST1
C:>DB2 selectcount( *) fromproject , project , project , project , project , project
1 ---------------------- 64000000 1条记录已选择。
清单 33. 在窗口 2 中执行大型查询
C:>DB2 selectcount( *) fromproject , project , project , project , project , project
1 ---------------------- 64000000 1条记录已选择。
清单 34. 在窗口 3 中执行大型查询
C:>DB2 selectcount( *) fromproject , project , project , project , project ,
project
SQL4712N 已超过阈值 "SQL080103142608430 "。原因码 ="6"。 SQLSTATE =5U026
总结工作负载管理( WLM )
通过上面的讲述和具体的例子,我们可以发现使用 DB2 V9.5 工作负载管理( WLM )可以更好地控制系统资源,增加了可预测性和稳定性。我们可以定义一个混合的工作负载来满足复杂的场景需求。针对越来越复杂的数据库活动,我们可以预定义一组工作负载,并使用相应的服务类、阈值、工作类和工作动作来标识数据库活动并将它们隔离在自己的执行环境中,并给其分配达到我们设定目标所需要的适当资源。在环境或服务类中,您可以显式管理系统资源,以便较重要的资源可供较高优先级的工作使用,并可以控制或消除与较低优先级工作的争用情况。
当我们的生产系统在高峰期时,增加的数据库活动会影响数据库的性能,通过使用工作负载管理( WLM ),我们可以预先确定适当的资源分配、活动的优先级划分和排队选项来高效地处理工作,从而可以平滑高峰工作负载。在您定义这些指示后,数据服务器使用它们来分配资源和划分工作的优先级。例如,您可以使工作远离流氓查询的影响,这些查询使用过量的数据库资源,因此会对系统上运行的其他查询带来负面影响并可能会影响整个数据库。通过使用阈值,您可以使用许多不同特征(如执行时间或系统临时表空间使用量)来定义系统内可接受的查询行为,并定义对不按要求执行的任何查询要执行哪些操作。这些操作包括收集关于查询的详细信息的功能以及自动取消查询的功能。
另外,通过使用 DB2 V9.5 新增的许多表函数,我们可以动态的监视数据库活动,可以让我们清楚哪个工作当前正在系统上运行、它在分区上的分布情况以及是否有特定的活动可能导致数据服务器上发生资源争用情况。