下面我们继续在窗口 1 中创建相应的工作动作集以及工作动作。发出 CREATE WORK ACTION SET 命令,创建工作动作集 MYWORKACTION,并创建面向工作类 smallQuery 的工作动作 smallQueryAction ,面向工作类 mediumQuery 的工作动作 mediumQueryAction,面向工作类 largeQuery 的工作动作 largeQueryAction,具体如清单 28 所示:
清单 28 . 在窗口 1 中创建工作动作集
C:\> db2 - tvf crtWorkActionSet.sql
alter work action set MYWORKACTION
alter smallQueryAction disable
alter mediumQueryAction disable
alter largeQueryAction disable
DB20000I SQL命令成功完成。
drop work action set MYWORKACTION
DB20000I SQL命令成功完成。
create work action set MYWORKACTION for database using work class set MYQUERY
( work action smallQueryAction on work class smallQuery
count activity,
work action mediumQueryAction on work class mediumQuery
collect activity data with details and values ,
work action largeQueryAction on work class largeQuery
when concurrentdbcoordactivities > 1 and queuedactivities > 1 stop 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 to db2test1 user rhette using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
8000
1 条记录已选择。
C:\> db2 select count ( * ) from project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
3200000
1 条记录已选择。
清单 30. 在窗口 3 中执行两个查询
C:\> db2 connect to db2test1 user rhette using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select count ( * ) from project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
8000
1 条记录已选择。
C:\> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 条记录已选择。
清单 31. 在窗口 2 中查看工作动作集的状态
C:\> db2 select substr( work_action_set_name , 1 , 18 ) as work_action_set_name ,
substr ( char ( dbpartitionnum ) , 1 , 4 ) as part ,
substr ( work_class_name , 1 , 15 ) as work_class_name , last_reset ,
substr ( char ( act_total ) , 1 , 14 ) as total_wlo_acts from
table ( WLM_GET_WORK_ACTION_SET_STATS ( cast ( null as varchar ( 128 ) ) , -2 ) )
as wasstats order by work_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.293798 0
MYWORKACTION 0 LARGEQUERY 2008-01-03-14.26.15.293791 1
MYWORKACTION 0 MEDIUMQUERY 2008-01-03-14.26.15.293754 1
MYWORKACTION 0 SMALLQUERY 2008-01-03-14.26.15.293717 3
4 条记录已选择。
命令成功完成。
接下来我们看一下如果同时在三个窗口执行同样的大型 SQL,会出现什么样的状况。首先在窗口 1 中执行一个大型查询 SQL,同时在窗口 2、3 也同时执行同样的大型 sql,在窗口 3 会报“ SQL4712N 已超过阈值 =‘SQL080103142608430’。原因码 = ‘6’。 SQLSTATE = 5U026”错误。窗口 1 和窗口 2 最终将查询出结果集来。具体如清单 30 所示:
清单 32. 在窗口 1 中执行大型查询
C:\> db2 connect to db2test1 user rhette using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = RHETTE
本地数据库别名 = DB2TEST1
C:\> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 条记录已选择。
清单 33. 在窗口 2 中执行大型查询
C:\> db2 select count ( * ) from project , project , project , project , project , project
1
- - - - - - - - - - - - - - - - - - - - - -
64000000
1 条记录已选择。
清单 34. 在窗口 3 中执行大型查询
C:\> db2 select count ( * ) from project , project , project , project , project ,
project
SQL4712N 已超过阈值 " SQL080103142608430 "。原因码 = " 6 "。 SQLSTATE = 5U026
总结工作负载管理( WLM )
通过上面的讲述和具体的例子,我们可以发现使用 DB2 V9.5 工作负载管理( WLM )可以更好地控制系统资源,增加了可预测性和稳定性。我们可以定义一个混合的工作负载来满足复杂的场景需求。针对越来越复杂的数据库活动,我们可以预定义一组工作负载,并使用相应的服务类、阈值、工作类和工作动作来标识数据库活动并将它们隔离在自己的执行环境中,并给其分配达到我们设定目标所需要的适当资源。在环境或服务类中,您可以显式管理系统资源,以便较重要的资源可供较高优先级的工作使用,并可以控制或消除与较低优先级工作的争用情况。
当我们的生产系统在高峰期时,增加的数据库活动会影响数据库的性能,通过使用工作负载管理( WLM ),我们可以预先确定适当的资源分配、活动的优先级划分和排队选项来高效地处理工作,从而可以平滑高峰工作负载。在您定义这些指示后,数据服务器使用它们来分配资源和划分工作的优先级。例如,您可以使工作远离流氓查询的影响,这些查询使用过量的数据库资源,因此会对系统上运行的其他查询带来负面影响并可能会影响整个数据库。通过使用阈值,您可以使用许多不同特征(如执行时间或系统临时表空间使用量)来定义系统内可接受的查询行为,并定义对不按要求执行的任何查询要执行哪些操作。这些操作包括收集关于查询的详细信息的功能以及自动取消查询的功能。
另外,通过使用 DB2 V9.5 新增的许多表函数,我们可以动态的监视数据库活动,可以让我们清楚哪个工作当前正在系统上运行、它在分区上的分布情况以及是否有特定的活动可能导致数据服务器上发生资源争用情况。 |