默认用户服务类名为: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
alter workload wl_rhette disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " WL_RHETTE " 是一个未定义的名称。 SQLSTATE = 42704
alter workload wl_db2admin disable
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " WL_DB2ADMIN " 是一个未定义的名称。 SQLSTATE = 42704
drop workload wl_rhette
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " WL_RHETTE " 是一个未定义的名称。 SQLSTATE = 42704
drop workload wl_db2admin
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " WL_DB2ADMIN " 是一个未定义的名称。 SQLSTATE = 42704
create workload wl_rhette session_user ( 'RHETTE' ) service class subclass_rhette
under super_class
DB20000I SQL命令成功完成。
create workload wl_db2admin session_user ( 'DB2ADMIN' ) service class subclass_db2
admin under super_class
DB20000I SQL命令成功完成。
命令成功完成,工作负载是通过工作所在的数据库连接属性来标识数据库活动,数据库连接的属性可以是:
4 APPLNAME ( ' application - name ' , . . . )
为APPLNAME连接属性指定一个或多个应用程序名称。在列表中同一个应用程序名称不能出现多次,否则会报SQLSTATE 42713错误。应用程序名称是大小写敏感的,应用程序名称就是我们执行LIST APPLICATIONS命令显示的值。
4 SYSTEM_USER ( ' authorization – name ' , . . . )
为SYSTEM USER连接属性指定一个或多个授权ID。在列表中同一个授权ID不能出现多次,否则会报SQLSTATE 42713错误。
4 SESSION_USER ( ' authorization – name ' , . . . )
为SESSION USER连接属性指定一个或多个授权ID。需要注意的是,授权ID大小写敏感。在列表中同一个授权ID不能出现多次,否则会报SQLSTATE 42713错误。
4 SESSION_USER GROUP ( ' authorization – name ' , . . . )
为SESSION_USER GROUP连接属性指定一个或多个授权ID。在列表中同一个授权ID不能出现多次,否则会报SQLSTATE 42713错误。
4 SESSION_USER ROLE ( ' authorization – name ' , . . . )
为SESSION_USER ROLE连接属性指定一个或多个授权ID。这里会话授权ID的角色是指会话授权ID所有可用的角色,不管这些角色是怎么获得的。在列表中同一个授权ID不能出现多次,否则会报SQLSTATE 42713错误。4 CURRENT CLIENT_USERID ( ' user – id ' , . . . )
为CURRENT CLIENT_USERID连接属性指定一个或多个客户端用户ID。在列表中同一个客户端用户ID不能出现多次,否则会报SQLSTATE 42713错误。4 CURRENT CLIENT_APPLNAME ( ' client – application – name ' , . . . )
为CURRENT CLIENT_APPLNAME连接属性指定一个或多个应用程序名称。在列表中同一个应用程序名称不能出现多次,否则会报SQLSTATE 42713错误。这个client – application – name是大小写敏感的,其值就是系统监控器输出中的" TP Monitor client application name "值。4 CURRENT CLIENT_WRKSTNNAME ( ' workstation – name ' , . . . )
为CURRENT CLIENT_WRKSTNNAME连接属性指定一个或多个客户端工作站名称。在列表中同一个客户端工作站名称不能出现多次,否则会报SQLSTATE 42713错误。4 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
Database Partition 0 - - Database DB2TEST1 - - Active - - Up 0 days 15:58:51
Workload Definition :
Address WorkloadID WorkloadName DBAccess
0x7E69F2E0 3 WL_RHETTE ALLOW
0x7E69F384 4 WL_DB2ADMIN ALLOW
0x7E69F428 1 SYSDEFAULTUSERWORKLOAD ALLOW
0x7E69F4C0 2 SYSDEFAULTADMWORKLOAD ALLOW
Usage Privilege Holders :
Address WorkloadID Type AuthID
0x7E687774 1 GROUP PUBLIC
Local Partition Workload Statistics :
Address WorkloadID WorkloadName NumWLO
0x7E6861C0 1 SYSDEFAULTUSERWORKLOAD 1
0x7E688D60 2 SYSDEFAULTADMWORKLOAD 0
0x7E69F150 3 WL_RHETTE 0
0x7E686070 4 WL_DB2ADMIN 0
我们也可以通过控制中心查看系统视图SYSCAT.WORKLOADS,来看一下我们创建的工作负载情况,具体如图4所示:
图4 查看工作负载情况
对特定的工作负载(和一个特定的连接相关联)来说,其会话用户必须具有该工作负载的USAGE特权,如果想查看工作负载相关的USAGE特权,可以访问系统视图SYSCAT.WORKLOADAUTH。我们继续在当前的DB2CLP窗口中,发出GRANT命令,把工作负载WL_RHETTE和WL_DB2ADMIN的USAGE特权赋给PUBLIC组,具体如清单10所示:
- - 清单10 . 把工作负载USAGE权限分配给PUBLIC组
C:\> db2 grant usage on workload WL_RHETTE to public
DB20000I SQL命令成功完成。
C:\> db2 grant usage on workload WL_DB2ADMIN to public
DB20000I SQL命令成功完成。
下面我们来看一下数据库连接、工作负载和服务类在具体的场景中是什么样子。
首先,我们关闭当前的DB2CLP窗口,再打开三个新的DB2CLP窗口,这样我们就有三个DB2CLP窗口,分别称之为窗口1、窗口2、窗口3。在窗口1中,我们发出DB2 CONNECT命令,连上示例数据库DB2TEST1,用户名为admnistrator,具体如清单11所示:
- - 清单11 . 在窗口1中使用admnistrator用户连接数据库
C:\> db2 connect to db2test1 user administrator using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = ADMINIST . . .
本地数据库别名 = DB2TEST1
命令成功完成,下面我们在窗口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 条记录已选择。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9524210/viewspace-511957/,如需转载,请注明出处,否则将追究法律责任。