命令成功完成,下面我们在窗口 2 中使用 RHETTE 用户连接示例数据库 DB2TEST1,并执行 SELECT 语句访问示例表 PROJEC,做一个查询量小的查询(用 PROJECT 表外连接自己),具体如清单 12 所示:
清单 12 . 在窗口 2 中使用 RHETTE 用户连接数据库
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 条记录已选择。
命令成功完成,下面我们在窗口 3 中用 DB2ADMIN 用户连接示例数据库 DB2TEST1,并执行 SELECT 语句访问示例表 PROJEC,做一个查询量小的查询(用 PROJECT 表外连接自己),具体如清单 13 所示:
清单13 . 在窗口 2 中使用 DB2ADMIN 用户连接数据库
C:\> db2 connect to db2test1 user db2admin using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = DB2ADMIN
本地数据库别名 = DB2TEST1
C:\> db2 select count ( * ) from rhette.project , rhette.project , rhette.project
1
- - - - - - - - - - - - - - - - - - - - - - - - - -
8000
1 条记录已选择。
命令执行成功,下面我们回到窗口 1,通过访问表函数 wlm_get_service_class_workload_occurrences 来获取当前发生的工作负载列表,在返回的结果集中,还将返回这些工作负载的一些相关信息,比如其所在的服务子类、服务父类等,具体如清单 14 所示:
清单14 . 在窗口 1 中查看当前发生的工作负载( workload )
C:\>db2 select substr ( session_auth_id , 1 , 8 ) as user,
substr ( char ( application_handle ) , 1 , 7 ) as apphndl,
substr ( workload_name , 1 , 24 ) as workload_name ,
substr ( service_superclass_name , 1 , 19 ) as superclass_name ,
substr ( service_subclass_name , 1 , 18 ) as subclass_name ,
substr ( char ( workload_occurrence_id ) , 1 , 6 ) as wlo_id ,
uow_id from
table ( wlm_get_service_class_workload_occurrences ( cast ( null as varchar ( 128 ) ) ,
cast( nullas varchar ( 128 ) ) , -2 ) ) as scinfo
USER APPHNDL WORKLOAD_NAME SUPERCLASS_NAME
SUBCLASS_NAME WLO_ID UOW_ID
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ADMINIST 580 SYSDEFAULTUSERWORKLOAD SYSDEFAULTUSERCLASS
SYSDEFAULTSUBCLASS 1 2
RHETTE 599 WL_RHETTE SUPER_CLASS
SUBCLASS_RHETTE 1 2
DB2ADMIN 600 WL_DB2ADMIN SUPER_CLASS
SUBCLASS_DB2ADMIN 1 4
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 select substr ( service_superclass_name , 1 , 19 ) as superclass_name ,
substr ( service_subclass_name , 1 , 18 ) as subclass_name ,
substr ( char ( dbpartitionnum ) , 1 , 4 ) as part , concurrent_act_top as acttop ,
coord_act_completed_total as completed from
table ( WLM_GET_SERVICE_SUBCLASS_STATS ( cast ( null as VARCHAR ( 128 ) ) ,
cast ( null as VARCHAR ( 128 ) ) , -2 ) ) as scstats order by superclass_name ,
subclass_name , part
SUPERCLASS_NAME SUBCLASS_NAME PART ACTTOP COMPLETED
- - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SUPER_CLASS SUBCLASS_DB2ADMIN 0 1 1
SUPER_CLASS SUBCLASS_RHETTE 0 1 4
SUPER_CLASS SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTMAINTENAN SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTSYSTEMCLA SYSDEFAULTSUBCLASS 0 0 0
SYSDEFAULTUSERCLASS SYSDEFAULTSUBCLASS 0 1 5
6 条记录已选择。
C:\>
命令执行成功,关于表函数 WLM_GET_SERVICE_SUBCLASS_STATS 更多的信息可以查看 DB2 V9.5 信息中心。另外,还可以通过访问表函数 WLM_GET_WORKLOAD_STATS 来查看多少工作负载完成、失败或者被拒绝,比如我们在窗口 1 中发出如清单 16 所示的语句:
清单 16 . 在窗口 1 中查看工作负载的执行情况
C:\> db2 select substr ( workload_name , 1 , 24 ) as wl_def_name,
concurrent_wlo_top as wlo_top, concurrent_wlo_act_top as wlo_act_top ,
int ( coord_act_completed_total ) as completed,
int ( coord_act_aborted_total ) as aborted,
int( coord_act_rejected_total ) as rejected
from table( WLM_GET_WORKLOAD_STATS ( cast ( null as varchar( 128 ) ) , -2 ) )
as wlstats order by wl_def_name
WL_DEF_NAME WLO_TOP WLO_ACT_TOP COMPLETED ABORTED REJECTED
- - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SYSDEFAULTADMWORKLOAD 0 0 0 0 0
SYSDEFAULTUSERWORKLOAD 1 1 6 0 0
WL_DB2ADMIN 1 1 1 2 0
WL_RHETTE 1 1 4 2 0
4 条记录已选择。