WLM 是用於在 DB2 V9.5 之後的版本中逐漸替代 Query Patroller 和 DB2 Governor 的工具,並且改進了這兩者的缺點,可以實現數據庫各種活動的全面監控,不僅針對 DML SQL,也適用於存儲過程,LOAD,DDL 等操作。
從用戶需求講起
David 是一家零售公司的數據倉庫管理員,最近他常常遭遇到這樣的困惑:為什麼一些應用程序或者 SQL 運行的時候,數據庫的性能總是降低很多?當數據庫用戶發出一些低效率的查詢或者操作時,為避免數據庫長時間的響應,可不可以有預見性的阻止這種情況的發生?現在 DB2 WarehouseV9.5 中就可以實現這些需求。
圖 1. 零售公司數據倉庫管理員的困惑
那麼,接下來 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 中各個實體之間的關系
在 Design Studio 中實現 WLM 方案
定義一個 WLM 方案
在了解了 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 秒時,將不允許該活動繼續運行。
為了實現上述目標,要經過以下幾個步驟:
1.安裝 DB2 Warehouse V9.5
DB2 Warehouse V9.5 較之前的 DWE9.1 版本有了很大的改進和提高,WLM 是其中比較重要的一個工具。在下面的安裝界面上,WLM 是以插件的形式集成在 Design Studio 中的。
圖 3. DB2 Warehouse V9.5 ClIEnt 安裝界面
安裝成功之後,從 Start -> All Programs -> IBM DB2 Warehouse 9.5 -> DB2COPY1 -> Design Studio 來啟動,會提示選擇一個 workspace,使用默認的即可。
2.注冊數據庫
打開工作空間之後,在左下角的 Database Explorer 中連接零售數據庫 DWESAMP,並確認連接成功即可。
圖 4. 在 Design Studio 中連接數據庫
3.創建數據倉庫工程
現在開始創建一個數據倉庫工程,從 Design Studio 的 File -> New -> Project 開始,選擇創建如下圖所示的 Project:
圖 5. 創建數據倉庫工程
這裡用 WLM Project 作為該工程的名稱。完成該向導之後,在 workspace 左邊的 D ata Project Explore r 會出現如下圖的目錄樹:
圖 6. 數據倉庫工程層次結構圖
4.創建 WLM Scheme
在上述創建的工程中,可以開始定義 WLM Scheme,如下:
圖 7. 創建 WLM Scheme
把該 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
下一步按照需求選擇對數據庫活動定義一些規則:
圖 9. 對數據庫活動定義規則
上一步的定義完成之後,就可以開始創建具體的 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 行的限制,並且當達到該閥值的時候會終止查詢活動。
5.創建 SuperClass
在下圖的編輯框中可以為 DB2Admin 用戶定義一個 SuperClass,命名為 DB2ADMIN_SC。
圖 10. 定義數據庫 SuperClass
點擊 OK 之後,定義的超類 DB2ADMIN_SC 會出現在 table 中。之前已有 3 個數據庫默認創建的 SuperClass。
6. 創建 Work Identity
點擊 Work Identity tab,會看見有 2 個默認的 Work Identity 已經存在。現在 ADD 一個新的 Work Identity,如圖 11:
圖 11. 定義數據庫 Work Identity
對該 Work Identity 的連接屬性只指定了系統用戶為 DB2ADMIN,這樣所有來自用戶 DB2ADMIN 的連接都會歸屬到 DB2ADMIN_WID 這個 Work Identity 之下。並且把該 Work Identity 和之前定義的 Super Class DB2ADMIN_SC 關聯起來。這樣,DB2ADMIN 發出的所有工作都在 Service Class DB2ADMIN_SC 下活動。
7.定義 Work Type
點擊 Work Type tab 來創建一個新的工作類,向導會提示先創建一個 Work Type Sets。這裡定義一個名為 DB2ADMIN_WTS 的工作類集。然後在該 Work Type Sets 之下創建一個名為 READ_WORKTYPE,類型為 READ 的 Work Type,如下圖:
圖 12. 定義數據庫 Work Type
完成之後可以在 Work Type tab 裡看到剛剛定義的 Work Type。
8.創建 Limits
最後,也是解決之前提出的問題的關鍵一步,就是創建 Limits。這裡,需要對某一個用戶源發出的某一類工作做出限制,所以創建一個如下圖所示的 Limits。在這個 CASE 中用戶源就是 DB2ADMIN,工作類型就是 READ。
圖 13. 定義數據庫 Limits (1)
ADD 之後,在 Create Limits tab 中產生一條 Domain 為 Subclass 的記錄,如下:
圖 14. 定義數據庫 Limits (2)
然後對 Work Identity 指定上面已經定義的 DB2ADMIN_WID,Work Type 指定已定義的 READ_WORKTYPE,並創建一個 Condition 作為 Limits 如下:
圖 15. 定義 Condition
這樣就完成了解決第一個問題的 WLM Scheme 的定義,從 Scheme VIEw 裡可以看見剛剛定義的所有數據庫實體在一個層次樹裡,如下圖:
圖 16. WLM Scheme HIErarchical Tree
從菜單上的 File -> Save All 可以保存該 Scheme。
執行並驗證 WLM 方案
上一部分只是完成了定義,這部分將執行該 Scheme,並驗證數據庫活動如何受其影響。在下圖中,先進行 validate,確認結果是成功的。然後在數據庫中執行該 WLM Scheme 用於創建之前定義的所有實體。
圖 17. 驗證和執行 WLM Scheme
點擊 Execute 後,在下述的 panel 中,Design Studio 將列出用於創建該 WLM Scheme 的所有 DDL。它有別於普通意義上的數據庫 DDL 語句,也是 DB2 在 V9.5 之後新加入的 Utility。
圖 18. WLM DDL 語句
在上圖中選擇 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
從上述的信息可以看出之前定義的閥值”SQL Rows Returned Rules”已經被超出,所以查詢自動終止。
修改並再次執行 WLM 方案
現在,為解決之前提出的第二個問題,需要再定義一些 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 中實體之間的關系
現在還是利用 Design Studio 中的可視化編輯器,通過下述的幾個步驟來定義相關的實體:
1.定義 SubClass
如下圖,在 WLM Scheme 樹形層次視圖中通過右鍵來創建 SubClass,通過向導可以很容易的完成。
圖 21. 在 WLM 中創建 SubClass
2.定義 DML 工作類型
圖 22. 在 WLM 中創建 DML Work Type
3.定義 Mapping Rule
圖 23. 在 WLM 中定義 Mapping Rule(1)
然後需要添加要 Map 的 Work Type 和 SubClass:
圖 24. 在 WLM 中定義 Mapping Rule(2)
4.最後需要定義 Control Rule
在 SubClass:DML_WORKTYPE_SUBCLASS 下有一個 Control Rules 的目錄,右鍵點擊就可以創建一個新的 Limit,按照需求完成對它的定義如下:
圖 25. 在 WLM 中定義 Control Rule
5.執行變化的 WLM Scheme
現在,所有的定義工作都已經完成,可以驗證並執行了。注意,現在不能再點擊 Execute,而是 Delta Execute。因為之前已經創建了一部分 WLM 對象,現在是加入了新的實體。如下:
圖 26. 在 WLM 中 Delta Execute
同樣,Design Studio 會根據新的定義產生出新的 WLM DDL 語句,然後確認連接到數據庫並執行成功即可。
6.驗證 WLM Scheme
還是用戶 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 閥值”Estimated SQL Cost Rule”已經被超出,並終止了 DML 語句的執行。
關於 DB2V9 中的 Workload Manager
本文中介紹的 WLM 只涉及到了很少的一部分功能,事實上 WLM 是 DB2V9.5 的一個新功能,用戶也可以完全通過 DB2 命令行的方式來實現定義和監控數據庫。但是如果對 WLM 的 DDL 不熟悉的話,Design Studio 提供了這樣一個很好的可視化編輯器來幫助用戶達到目的。