WLM 是用于在 DB2 V9.5 之后的版本中逐渐替代 Query Patroller 和 DB2 Governor 的工具,并且改进了这两者的缺点,可以实现数据库各种活动的全面监控,不仅针对 DML SQL,也适用于存储过程,LOAD,DDL 等操作。
声明:本文中的人名和场景纯属虚构,与真实案例无涉。
David 是一家零售公司的数据仓库管理员,最近他常常遭遇到这样的困惑:为什么一些应用程序或者 SQL 运行的时候,数据库的性能总是降低很多?当数据库用户发出一些低效率的查询或者操作时,为避免数据库长时间的响应,可不可以有预见性的阻止这种情况的发生?现在 DB2 WarehouseV9.5 中就可以实现这些需求。
图 1. 零售公司数据仓库管理员的困惑
![零售公司数据仓库管理员的困惑](https://i-blog.csdnimg.cn/blog_migrate/3eefe2d0a576d4e5f208a470e0fe895d.png)
那么,接下来 David 该如何做呢?DB2 Warehouse 最新版本 V9.5 中的 Workload Manager 可以帮助 David 以一种可视化的简便方式轻松的实现这一目标。
在 DB2V9.5 WLM 中引入了一系列新的概念和术语,在开始介绍之前,有必要先了解这些关键词:
- DB2 Workload
在 DB2 数据库中,以不同的连接用户来定义的一组工作的集合,其目的是为了控制某一个或者某一类用户发出的数据库活动。Workload 这种数据库对象还包含了用户定义的一些规则,基于这些规则,不同的工作单元被组成实体,并作为一个整体来处理。 - DB2 Service Class
对于 DB2 数据库中执行的工作 , Service Class 对其进行分类管理 , 并作为资源分配和监控的对象。同时,还在操作系统级也可以定义 Service Class,对使用到的外部资源进行优化管理,比如 CPU 和内存。Service Class 具有两层结构:超类(Service SuperClass)和子类(Service SubClass)。其中超类是用来定义数据库连接这一层,而子类对不同的数据库活动进行定义,一个超类中可以包含多个子类。基于 Workload 定义的信息,每个数据库连接都可以映射到一个超类。而通过该数据库连接发出的所有数据库活动都可以根据其活动类型来映射到超类下属的某个子类。 - DB2 Work Action Set
一类数据库工作的集合,比如:数据量很大的读写操作或者比较消耗资源的数据库操作。 - DB2 Work Class Set
类似于 Work Action Set,也是用于对不同数据库活动归类,但是它还可以对数据库活动的具体边界值进行界定,比如读写操作的估计开销大于某个值的时候归为一类 Class。 - DB2 Work Action
在 Work Action Set 之下的具体的数据库活动类别,比如:读写操作,DML,DDL,LOAD, 或者调用存储过程。 - DB2 Thresholds & Limits
针对数据库不同的活动定义的阀值,比如某个 DML 操作返回的 SQL 行数,预计的 SQL 开销,消耗的临时表空间大小,某个数据库活动总的花费时间。统计型的阀值是对于整个数据库,某个分区,或者某个超类而言,比如,数据库中并发的数据库活动,某个 Workload 下的并发活动,所有数据库分区的连接数目等等。 - DB2 Activity
指具体的某一个数据库活动,可以是一个查询,或者任何数据库操作。
以上定义的这些数据库实体之间的关系可以用下图来表示:
图 2. DB2 WLM 中各个实体之间的关系
![DB2 WLM 中各个实体之间的关系](https://i-blog.csdnimg.cn/blog_migrate/eadee4fbf6976b78136bb7241e0f2048.png)
在了解了 WLM 的基本概念之后,现在 David 可以开始定义一个 WLM 方案来帮助他解决困惑。虽然他可以通过 DB2 命令行的方式来完成这项工作,但是由于对 WLM 的 DDL 语句并不熟悉,而 DB2 Warehouse V9.5 的 Design Studio 正好提供了可视化的 WLM 插件来实现这一目的,David 决定使用这种更为简便的工具。
Design Studio 是以 eclipse 为基础平台的开发的一套数据仓库设计工具,在最新的 V9.5 版本中集成了众多插件以支持数据仓库对多种不同应用的设计开发,其中就包括了 WLM。在安装 Design Studio 的时候,只要选择了 WLM 插件,就可以顺利进行下面的工作。
现在,David 要解决以下 2 个问题来有效的控制数据库活动:
- 限制由数据库用户 db2admin 发出的读取操作,当 read 操作返回的数据行数大于 N 时,终止这个操作。
- 限制由数据库用户 db2admin 发出的 DML 活动,当预计的 SQL COST 运行时间大于 200 秒时,将不允许该活动继续运行。
为了实现上述目标,要经过以下几个步骤:
DB2 Warehouse V9.5 较之前的 DWE9.1 版本有了很大的改进和提高,WLM 是其中比较重要的一个工具。在下面的安装界面上,WLM 是以插件的形式集成在 Design Studio 中的。
图 3. DB2 Warehouse V9.5 Client 安装界面
![DB2 Warehouse V9.5 Client 安装界面](https://i-blog.csdnimg.cn/blog_migrate/37922c8dc594367d430f24c9525a6df8.png)
安装成功之后,从 Start -> All Programs -> IBM DB2 Warehouse 9.5 -> DB2COPY1 -> Design Studio 来启动,会提示选择一个 workspace,使用默认的即可。
打开工作空间之后,在左下角的 Database Explorer 中连接零售数据库 DWESAMP,并确认连接成功即可。
图 4. 在 Design Studio 中连接数据库
![在 Design Studio 中连接数据库](https://i-blog.csdnimg.cn/blog_migrate/99a41581a0e788ff51bab69843cfa6d6.png)
现在开始创建一个数据仓库工程,从 Design Studio 的 File -> New -> Project 开始,选择创建如下图所示的 Project:
图 5. 创建数据仓库工程
![创建数据仓库工程](https://i-blog.csdnimg.cn/blog_migrate/ef968fcfa186d168675190527bd14c49.png)
这里用 WLM Project 作为该工程的名称。完成该向导之后,在 workspace 左边的 D ata Project Explore r
会出现如下图的目录树:
图 6. 数据仓库工程层次结构图
![数据仓库工程层次结构图](https://i-blog.csdnimg.cn/blog_migrate/5eb02b12ff15a4df30020bf078dd8138.png)
在上述创建的工程中,可以开始定义 WLM Scheme,如下:
图 7. 创建 WLM Scheme
![创建 WLM Scheme](https://i-blog.csdnimg.cn/blog_migrate/454a35d765552bdd4f1a5ae02b1d498c.png)
把该 WLM 命名为 WLM_JKSales 并选择”Create a scheme by objective”类型,如图 8
。这里有 3
种方法可以创建 WLM Scheme
:
Create a scheme by objective
Create a scheme by yourself
Create a scheme by reverse engineering
其最终效果都一样,用 objective 可以用 WLM Editor 来直接编辑和修改。
图 8. 创建 WLM Scheme by objective
![创建 WLM Scheme by objective](https://i-blog.csdnimg.cn/blog_migrate/02b4586ed0d967bcb273500432bd1b3a.png)
下一步按照需求选择对数据库活动定义一些规则:
图 9. 对数据库活动定义规则
![对数据库活动定义规则](https://i-blog.csdnimg.cn/blog_migrate/2ffb56b84cba9e41da892578db2d8341.png)
上一步的定义完成之后,就可以开始创建具体的 WLM 实体对象来解决之前提出的问题。这里,有必要结合这个具体的案例来重新解释 WLM 的相关概念。
- 数据库超类 (Database SuperClass):表示不同的数据源用户提交的可执行工作的集合。这个 CASE 中就是所有由 DB2ADMIN 用户提交的工作都在 SuperClass 下执行。
- 工作实体 (Work Identities):由连接属性来定义的代表工作提交者的实体,和一个 SuperClass 相关联。这里的 Work Identities 就是表示 DB2ADMIN 用户提交的工作集合,它和前面提到的 Work Load 是一个概念。
- 工作类型 (Work Type):用户会在一个工作类型集中提交一个工作类。该 CASE 中,在创建 Work Type READ 之前先要创建 Work Type Set。不同的数据库活动具备不同的属性,比如 DDL, DML 等等。
- 限制 (Limits/Control Rules):用于强加给数据库活动的边界值或者限制。该 CASE 中,会给查询操作创建一个返回数据不超过 15 行的限制,并且当达到该阀值的时候会终止查询活动。
在下图的编辑框中可以为 DB2Admin 用户定义一个 SuperClass,命名为 DB2ADMIN_SC。
图 10. 定义数据库 SuperClass
![定义数据库 SuperClass](https://i-blog.csdnimg.cn/blog_migrate/532847c2d80298ce357c41a9b2ad212e.png)
点击 OK 之后,定义的超类 DB2ADMIN_SC 会出现在 table 中。之前已有 3 个数据库默认创建的 SuperClass。
点击 Work Identity tab,会看见有 2 个默认的 Work Identity 已经存在。现在 ADD 一个新的 Work Identity,如图 11:
图 11. 定义数据库 Work Identity
![定义数据库 Work Identity](https://i-blog.csdnimg.cn/blog_migrate/a0a83319cbbea585c210c40ec8a97d7f.png)
对该 Work Identity 的连接属性只指定了系统用户为 DB2ADMIN,这样所有来自用户 DB2ADMIN 的连接都会归属到 DB2ADMIN_WID 这个 Work Identity 之下。并且把该 Work Identity 和之前定义的 Super Class DB2ADMIN_SC 关联起来。这样,DB2ADMIN 发出的所有工作都在 Service Class DB2ADMIN_SC 下活动。
点击 Work Type tab 来创建一个新的工作类,向导会提示先创建一个 Work Type Sets。这里定义一个名为 DB2ADMIN_WTS 的工作类集。然后在该 Work Type Sets 之下创建一个名为 READ_WORKTYPE,类型为 READ 的 Work Type,如下图:
图 12. 定义数据库 Work Type
![定义数据库 Work Type](https://i-blog.csdnimg.cn/blog_migrate/c1222cdf1272f2c5eb16f2103db0933b.png)
完成之后可以在 Work Type tab 里看到刚刚定义的 Work Type。
最后,也是解决之前提出的问题的关键一步,就是创建 Limits。这里,需要对某一个用户源发出的某一类工作做出限制,所以创建一个如下图所示的 Limits。在这个 CASE 中用户源就是 DB2ADMIN,工作类型就是 READ。
图 13. 定义数据库 Limits (1)
![定义数据库 Limits (1)](https://i-blog.csdnimg.cn/blog_migrate/df32629821c4a05ac3a489ecb6e1c68c.png)
ADD 之后,在 Create Limits tab 中产生一条 Domain 为 Subclass 的记录,如下:
图 14. 定义数据库 Limits (2)
![定义数据库 Limits (2)](https://i-blog.csdnimg.cn/blog_migrate/536959606bf4350ce3f1778b0e009c3d.png)
然后对 Work Identity 指定上面已经定义的 DB2ADMIN_WID,Work Type 指定已定义的 READ_WORKTYPE,并创建一个 Condition 作为 Limits 如下:
图 15. 定义 Condition
![定义 Condition](https://i-blog.csdnimg.cn/blog_migrate/7882a58490988eb23a3898e57cfc24b1.png)
这样就完成了解决第一个问题的 WLM Scheme 的定义,从 Scheme View 里可以看见刚刚定义的所有数据库实体在一个层次树里,如下图:
图 16. WLM Scheme Hierarchical Tree
![WLM Scheme Hierarchical Tree](https://i-blog.csdnimg.cn/blog_migrate/13f09371f1ec244c12557ed6281754ba.png)
从菜单上的 File -> Save All 可以保存该 Scheme。
上一部分只是完成了定义,这部分将执行该 Scheme,并验证数据库活动如何受其影响。在下图中,先进行 validate,确认结果是成功的。然后在数据库中执行该 WLM Scheme 用于创建之前定义的所有实体。
图 17. 验证和执行 WLM Scheme
![验证和执行 WLM Scheme](https://i-blog.csdnimg.cn/blog_migrate/a65251dfdd9079082d1e75568aa08081.png)
点击 Execute 后,在下述的 panel 中,Design Studio 将列出用于创建该 WLM Scheme 的所有 DDL。它有别于普通意义上的数据库 DDL 语句,也是 DB2 在 V9.5 之后新加入的 Utility。
图 18. WLM DDL 语句
![WLM DDL 语句](https://i-blog.csdnimg.cn/blog_migrate/5ee525f7647e3d64a38053c5c36302ec.png)
在上图中选择 Execute in database,就会在实际的数据库中执行这些语句。按照向导一步步完成并执行成功后,可以在数据库验证结果。
现在,用户 DB2ADMIN 连接数据库 DWESAMP,并从 DB2 Command Line 来执行下述的 2 个语句:
select * from DWH.CL where CL_ID=9 select * from DWH.CL |
DWH.CL 表中 CL_ID 是主键,但是表的总行数大于 15。当执行第一个语句时,没有任何错误产生。但是当执行第二个语句时,发生如下错误:
图 19. 验证 WLM Threshold
![验证 WLM Threshold](https://i-blog.csdnimg.cn/blog_migrate/9f54a83553e50d06e88a22f02d6fc50e.png)
从上述的信息可以看出之前定义的阀值”SQL Rows Returned Rules”已经被超出,所以查询自动终止。
现在,为解决之前提出的第二个问题,需要再定义一些 Limits 来实现,通过以下 3 个步骤来实现这一目标:
- 在之前的 Super Class DB2ADMIN_SC 下创建一个 Sub Class,命名为:
DML_WORKTYPE_SUBCLASS
。 - 在之前的 Work Type Sets :DB2ADMIN_WTS 下创建一个 DML 类型的 Work Type,并且把它和第一步定义的 Sub Class:
DML_WORKTYPE_SUBCLASS
映射起来。 - 为 Sub Class:
DML_WORKTYPE_SUBCLASS
定义一个Limit
:当预计的SQL Cost
大于200 timerons
时,终止DML
语句的执行。
从下图可以简单的看出这个 CASE 中各个实体之间的关系:
图 20. WLM 中实体之间的关系
![WLM 中实体之间的关系](https://i-blog.csdnimg.cn/blog_migrate/37f7a2886865e2c698eba639712a8125.png)
现在还是利用 Design Studio 中的可视化编辑器,通过下述的几个步骤来定义相关的实体:
如下图,在 WLM Scheme 树形层次视图中通过右键来创建 SubClass,通过向导可以很容易的完成。
图 21. 在 WLM 中创建 SubClass
![在 WLM 中创建 SubClass](https://i-blog.csdnimg.cn/blog_migrate/e7d8d33d56fd4e5e6a98eb2d63956500.png)
图 22. 在 WLM 中创建 DML Work Type
![在 WLM 中创建 DML Work Type](https://i-blog.csdnimg.cn/blog_migrate/90ce2c25f576a633a880d7772a8b596e.png)
图 23. 在 WLM 中定义 Mapping Rule(1)
![在 WLM 中定义 Mapping Rule(1)](https://i-blog.csdnimg.cn/blog_migrate/d9a7562519bbff1d859d9523769a9a72.png)
然后需要添加要 Map 的 Work Type 和 SubClass:
图 24. 在 WLM 中定义 Mapping Rule(2)
![在 WLM 中定义 Mapping Rule(2)](https://i-blog.csdnimg.cn/blog_migrate/2d4d8564c173a2dae0191aef0ccf6d5b.png)
在 SubClass:DML_WORKTYPE_SUBCLASS
下有一个 Control Rules
的目录,右键点击就可以创建一个新的 Limit
,按照需求完成对它的定义如下:
图 25. 在 WLM 中定义 Control Rule
![在 WLM 中定义](https://i-blog.csdnimg.cn/blog_migrate/014e5728c1ccb672c73e40152b01724d.png)
现在,所有的定义工作都已经完成,可以验证并执行了。注意,现在不能再点击 Execute,而是 Delta Execute。因为之前已经创建了一部分 WLM 对象,现在是加入了新的实体。如下:
图 26. 在 WLM 中 Delta Execute
![在 WLM 中 Delta Execute](https://i-blog.csdnimg.cn/blog_migrate/1ccafb6887f41c869898a9365f3a1a4a.png)
同样,Design Studio 会根据新的定义产生出新的 WLM DDL 语句,然后确认连接到数据库并执行成功即可。
还是用户 DB2ADMIN 连接到数据库 DWESAMP,并从 DB2 Command Line 来执行下述的 2 个语句:
update DWH.TBL_ROWS SET NUM_ROWS=NUM_ROWS+1 WHERE ID=1 update DWH.TBL_ROWS SET NUM_ROWS=NUM_ROWS+1 |
其中,第一个语句的执行时间不会超过 200 秒,但是第二个语句会消耗比较长的时间。那么,在执行后一个语句时,DB2 报告了以下的错误:
图 27. 验证 WLM Threshold
![验证 WLM Threshold](https://i-blog.csdnimg.cn/blog_migrate/4b2206ff3be1820c434b25de0ad720dc.png)
从上述的信息可以看出,新定义的 WLM 阀值”Estimated SQL Cost Rule”已经被超出,并终止了 DML 语句的执行。