【赛迪网-IT技术报道】在 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 to db2test1 user administrator using passw0rd
数据库连接信息
数据库服务器 = DB2 / NT 9.5.0
SQL 授权标识 = ADMINIST . . .
本地数据库别名 = DB2TEST1
C:\> db2 -tvf createthreshold.sql
ALTER THRESHOLD LargeQuery DISABLE
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " LARGEQUERY " 是一个未定义的名称。 SQLSTATE = 42704
DROP THRESHOLD LargeQuery
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " LARGEQUERY " 是一个未定义的名称。 SQLSTATE = 42704
CREATE THRESHOLD LargeQuery FOR service class SUPER_CLASS ACTIVITIES
ENFORCEMENT DATABASE WHEN ESTIMATEDSQLCOST > 100000 STOP EXECUTION
DB20000I 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
本地数据库别名 = DB2TEST1
C:\> db2 select count ( * ) from project , 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
ALTER THRESHOLD MYCUNCURRENT DISABLE
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " MYCUNCURRENT " 是一个未定义的名称。 SQLSTATE = 42704
DROP THRESHOLD MYCUNCURRENT
DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行处理器”命令。在
SQL 处理期间,它返回:
SQL0204N " MYCUNCURRENT " 是一个未定义的名称。 SQLSTATE = 42704
CREATE THRESHOLD MYCUNCURRENT FOR SERVICE CLASS subclass_db2admin
UNDER super_class ACTIVITIES ENFORCEMENT DATABASE WHEN CONCURRENTDBCOORDACTIVITIES > 1
STOP EXECUTION
DB20000I SQL命令成功完成。
命令成功完成。我们继续在窗口 2 中用 DB2ADMIN 用户连上示例数据库 DB2TEST1,具体如清单 20 所示:
清单20 . 在窗口 2 中执行一个简单查询
C:\> db2 connect reset
DB20000I 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.project
1
- - - - - - - - - - - - - - - - - - - - - -
3200000
1 条记录已选择。
清单 21-2 . 在窗口 3 中执行同一个简单查询
C:\> db2 select count ( * ) from rhette.project , rhette.project , rhette.project ,
rhette.project , rhette.project
SQL4712N 已超过阈值 " MYCUNCURRENT "。原因码 = " 6 "。 SQLSTATE = 5U026
1
2
下一页>>