程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 V9.5 工作負載管理之阈值(THRESHOLD)

DB2 V9.5 工作負載管理之阈值(THRESHOLD)

編輯:DB2教程

阈值( 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

從上面兩個例子我們可以看到,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 不會被執行。默認值是零。

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.sql
ALTER THRESHOLD MYCUNCURRENT DISABLE
DB20000I SQL命令成功完成。
DROP THRESHOLD MYCUNCURRENT
DB20000I SQL命令成功完成。
ALTER THRESHOLD LargeQuery DISABLE
DB20000I SQL命令成功完成。
DROP THRESHOLD LargeQuery
DB20000I SQL命令成功完成。

命令成功完成,這樣我們就刪除了剛才我們定義的兩個阈值。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved