DB2 V9.5 工作负载管理,第 4 部分: 阈值(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 to db2test1 user administrator using passw0rd   数据库连接信息 数据库服务器         = DB2 / NT 9.5.0 SQL 授权标识         = ADMINIST . . . 本地数据库别名       = DB2TEST1C:> db2 -tvf createthreshold.sqlALTER THRESHOLD LargeQuery DISABLEDB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:SQL0204N  " LARGEQUERY " 是一个未定义的名称。  SQLSTATE = 42704DROP THRESHOLD LargeQueryDB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:SQL0204N  " LARGEQUERY " 是一个未定义的名称。  SQLSTATE = 42704CREATE THRESHOLD LargeQuery FOR service class SUPER_CLASS ACTIVITIES ENFORCEMENT  DATABASE WHEN ESTIMATEDSQLCOST  > 100000 STOP EXECUTIONDB20000I  SQL命令成功完成。      

继续在窗口 2 中执行一个大的查询(此时我们的用户是 RHETTE,如果执行查询,该查询会属于 SUPER_CLASS 服务类),这时我们会收到“ SQL4712N 已超过阈值 ‘ LARGEQUERY ’。原因码 = ‘7’。 SQLSTATE = 5U026”的错误信息,这是因为我们执行的查询超过了我们预先定义的边界,具体如清单 18 所示:

清单 18 . 在窗口 2 中执行一个大型查询
                C:> db2 connect to db2test1 user rhette using passw0rd   数据库连接信息 数据库服务器         = DB2 / NT 9.5.0 SQL 授权标识         = RHETTE 本地数据库别名       = DB2TEST1C:> db2  select count ( * ) from project , project , project , project , project , projectSQL4712N  已超过阈值 " LARGEQUERY "。原因码 = " 7 "。  SQLSTATE = 5U026      

接下来我们创建一个新的阈值,用来限制同一条 SQL,并发执行数大于 1,我们继续在窗口 1 中发出 CREATE THRESHOLD 语句,创建新的阈值 MYCUNCURRENT,阈值范围是整个数据库,阈值的边界 CONCURRENTDBCOORDACTIVITIES 大于 1。CONCURRENTDBCOORDACTIVITIES 用来表示某个特定动作的并发执行数。具体如清单 19 所示:

清单 19 . 在窗口 1 中创建一个阈值,限制并发执行数
                C:>db2 -tvf crtThresCurrency.sqlALTER THRESHOLD MYCUNCURRENT DISABLEDB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:SQL0204N  " MYCUNCURRENT " 是一个未定义的名称。  SQLSTATE = 42704DROP THRESHOLD MYCUNCURRENTDB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:SQL0204N  " MYCUNCURRENT " 是一个未定义的名称。  SQLSTATE = 42704CREATE THRESHOLD MYCUNCURRENT FOR SERVICE CLASS subclass_db2admin UNDER super_class ACTIVITIES ENFORCEMENT DATABASE WHEN CONCURRENTDBCOORDACTIVITIES > 1 STOP EXECUTIONDB20000I  SQL命令成功完成。
参与6

6同行回答

wgw823wgw823技术经理深圳市博众信息技术有限公司
:handshake 感谢楼主,文章写得不错,好好应用一下显示全部
:handshake 感谢楼主,文章写得不错,好好应用一下收起
互联网服务 · 2010-03-30
浏览1040
清单 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 ( ...显示全部
清单 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 , partWORK_ACTION_SET_NAME        PART     WORK_CLASS_NAME LAST_RESET         TOTAL_WLO_ACTS- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MYWORKACTION         0      *               2008-01-03-14.26.15.293798 0MYWORKACTION         0    LARGEQUERY      2008-01-03-14.26.15.293791 1MYWORKACTION         0    MEDIUMQUERY     2008-01-03-14.26.15.293754 1MYWORKACTION         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 本地数据库别名       = DB2TEST1C:\> db2 select count ( * ) from project , project , project , project , project , project1- - - - - - - - - - - - - - - - - - - - - -   640000001 条记录已选择。      


清单 33. 在窗口 2 中执行大型查询
                C:\> db2 select count ( * ) from project , project , project , project , project , project1- - - - - - - - - - - - - - - - - - - - - -   640000001 条记录已选择。      


清单 34. 在窗口 3 中执行大型查询
                C:\> db2 select count ( * ) from project , project , project , project , project , projectSQL4712N  已超过阈值 " SQL080103142608430 "。原因码 = " 6 "。  SQLSTATE = 5U026      

总结工作负载管理( WLM )

通过上面的讲述和具体的例子,我们可以发现使用 DB2 V9.5 工作负载管理( WLM )可以更好地控制系统资源,增加了可预测性和稳定性。我们可以定义一个混合的工作负载来满足复杂的场景需求。针对越来越复杂的数据库活动,我们可以预定义一组工作负载,并使用相应的服务类、阈值、工作类和工作动作来标识数据库活动并将它们隔离在自己的执行环境中,并给其分配达到我们设定目标所需要的适当资源。在环境或服务类中,您可以显式管理系统资源,以便较重要的资源可供较高优先级的工作使用,并可以控制或消除与较低优先级工作的争用情况。

当我们的生产系统在高峰期时,增加的数据库活动会影响数据库的性能,通过使用工作负载管理( WLM ),我们可以预先确定适当的资源分配、活动的优先级划分和排队选项来高效地处理工作,从而可以平滑高峰工作负载。在您定义这些指示后,数据服务器使用它们来分配资源和划分工作的优先级。例如,您可以使工作远离流氓查询的影响,这些查询使用过量的数据库资源,因此会对系统上运行的其他查询带来负面影响并可能会影响整个数据库。通过使用阈值,您可以使用许多不同特征(如执行时间或系统临时表空间使用量)来定义系统内可接受的查询行为,并定义对不按要求执行的任何查询要执行哪些操作。这些操作包括收集关于查询的详细信息的功能以及自动取消查询的功能。

另外,通过使用 DB2 V9.5 新增的许多表函数,我们可以动态的监视数据库活动,可以让我们清楚哪个工作当前正在系统上运行、它在分区上的分布情况以及是否有特定的活动可能导致数据服务器上发生资源争用情况。

文章来源:http://www.ibm.com/developerwork ... 5chengy7/index.html收起
2008-07-03
浏览1122
工作操作( WORK ACTION )是一个用来控制某一种类型工作所对应数据库活动的方法。简单的说就是,当数据库活动满足已经定义好的工作类( WORK CLASS )所涉及的范围时,就会触发相应的工作操作( WORK ACTION )。下面我们在窗口 1 中,发出 CREATE WORK CLASS SET 命令,创建工作类集 myque...显示全部
工作操作( WORK ACTION )是一个用来控制某一种类型工作所对应数据库活动的方法。简单的说就是,当数据库活动满足已经定义好的工作类( WORK CLASS )所涉及的范围时,就会触发相应的工作操作( WORK ACTION )。

下面我们在窗口 1 中,发出 CREATE WORK CLASS SET 命令,创建工作类集 myquery,其下包含三个工作类,分别是针对小型查询的 smallquery,针对中型查询的 mediumquery 以及针对大型查询的 largequery,工作类型都是 DML,具体如清单 27 所示:

清单 27 . 在窗口 1 中创建工作类集
                C:\> db2 connect to db2test1 user administrator using passw0rd   数据库连接信息 数据库服务器         = DB2 / NT 9.5.0 SQL 授权标识         = ADMINIST . . . 本地数据库别名       = DB2TEST1C:\> db2 - tvf crtWorkClassSet.sqldrop work class set myqueryDB21034E  该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在SQL 处理期间,它返回:SQL0204N  " MYQUERY " 是一个未定义的名称。  SQLSTATE = 42704create work class set myquery (work class smallQuery work type dml for timeroncost from 1 to 1000 , work class mediumQuery work type dml for timeroncost from 1000 to 100000 , work class largeQuery work type dml for timeroncost from 100000 tounbounded )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.sqlalter work action set MYWORKACTION    alter smallQueryAction disable   alter mediumQueryAction disable   alter largeQueryAction disableDB20000I  SQL命令成功完成。drop work action set MYWORKACTIONDB20000I  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 本地数据库别名       = DB2TEST1C:\> db2 select count ( * ) from project , project , project1- - - - - - - - - - - - - - - - - - - - - -       8000  1 条记录已选择。C:\> db2 select count ( * ) from project , project , project , project , project1- - - - - - - - - - - - - - - - - - - - - -    3200000  1 条记录已选择。      


清单 30. 在窗口 3 中执行两个查询
                C:\> db2 connect to db2test1 user rhette using passw0rd   数据库连接信息 数据库服务器         = DB2 / NT 9.5.0 SQL 授权标识         = RHETTE 本地数据库别名       = DB2TEST1C:\> db2 select count ( * ) from project , project , project1- - - - - - - - - - - - - - - - - - - - - -       8000  1 条记录已选择。C:\> db2 select count ( * ) from project , project , project , project , project , project1- - - - - - - - - - - - - - - - - - - - - -   640000001 条记录已选择。
收起
2008-07-03
浏览1038
取消一个数据库活动在我们生产系统中,可能存在一些正在运行的大 SQL,这些活动消耗了太多的资源。如果我们想停止这些正在执行的活动,可以调用 WLM_CANCEL_ACTIVITY() 存储过程,如果想捕获一个活动的详细信息可以调用 WLM_CAPTURE_ACTIVITY_IN_PROGRESS() 存储过程,如果想收集和重...显示全部
取消一个数据库活动

在我们生产系统中,可能存在一些正在运行的大 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 to db2test1 user rhette using passw0rd   数据库连接信息 数据库服务器         = DB2 / NT 9.5.0 SQL 授权标识         = DB2ADMIN 本地数据库别名       = DB2TEST1C:\> db2 select count ( * ) from rhette.project ,  rhette.project , rhette.project , 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.txtSELECT T.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 ( NULL AS BIGINT ) , -2 ) ) T ORDER BY T.LOCAL_START_TIMEAPPLICATION_HANDLE        UOW_ID  ACTIVITY_ID  ACTIVITY_TYPE     ACTIVITY_STATE    LOCAL_START_TIME- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 80               7           1        READ_DML          EXECUTING        2008-01-02-17.01.25.30688981               10          1        READ_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 select count ( * ) from rhette.project ,  rhette.project , rhette.project , rhette.project , rhette.project , rhette.project1- - - - - - - - - - - - - - - - -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此属性对应的活动可以是以上属性中出现任意一个活动。收起
2008-07-03
浏览1071
ESTIMATEDSQLCOST > bigint-value 这个条件定义了一个活动的优化器分配成本的上限。条件值可以是任何非零正整数(如果违反,则会报 SQLSTATE 42820)。这个条件的定义域( definition domain )必须是数据库( DATABASE ),工作动作( WORK ACTION ),服务父类( SERVICE SUPERCLASS ),或者服务...显示全部
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.sqlALTER THRESHOLD MYCUNCURRENT DISABLEDB20000I  SQL命令成功完成。DROP THRESHOLD MYCUNCURRENTDB20000I  SQL命令成功完成。ALTER THRESHOLD LargeQuery DISABLEDB20000I  SQL命令成功完成。DROP THRESHOLD LargeQueryDB20000I  SQL命令成功完成。      
命令成功完成,这样我们就删除了刚才我们定义的两个阈值。

文章来源:http://www.ibm.com/developerwork ... 5chengy6/index.html收起
2008-07-03
浏览1101
命令成功完成。我们继续在窗口 2 中用 DB2ADMIN 用户连上示例数据库 DB2TEST1,具体如清单 20 所示:清单 20 . 在窗口 2 中执行一个简单查询                C:\> db2 connect resetDB20000I  SQL命令成功完成...显示全部
命令成功完成。我们继续在窗口 2 中用 DB2ADMIN 用户连上示例数据库 DB2TEST1,具体如清单 20 所示:

清单 20 . 在窗口 2 中执行一个简单查询
                C:\> db2 connect resetDB20000I  SQL命令成功完成。C:\> db2 connect to db2test1 user db2admin 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  select count ( * ) from rhette.project , rhette.project , rhette.project , rhette.project , rhette.project1- - - - - - - - - - - - - - - - - - - - - -    32000001 条记录已选择。      

清单 21-2 . 在窗口 3 中执行同一个简单查询
                C:\>  db2  select count ( * ) from rhette.project , rhette.project , rhette.project , rhette.project , rhette.projectSQL4712N  已超过阈值 " 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 不会被执行。默认值是零。收起
2008-07-03
浏览1064

提问者

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2008-07-03
  • 关注会员:0 人
  • 问题浏览:5508
  • 最近回答:2010-03-30
  • X社区推广