DB2 V9.5工作負載管理(五)

rheet1978發表於2008-12-15
閾值(THRESHOLD)

 

可以通過建立閾值的方式對服務類所使用的資源進行控制,閾值可以根據不同的型別進行建立。閾值提供一種方法,用來控制每種工作能夠使用的資源數量。在工作負載管理(WLM)解決方案中,你可以使用閾值來防止系統過載或者資源被濫用現象的發生。通過閾值,你可以直接對特定的資源設定限定,當超過限定時,就會觸發特定的動作。

支援的動作有:

Ø         STOP EXECUTION:停止違反閾值的相關動作

Ø         CONTINUE:繼續執行

Ø         收集違反閾值的相關動作資訊

不管違反閾值的特定動作被停止還是繼續執行,你都可以收集該動作的詳細資訊。當特定動作完成後,其相關資訊會被活動的ACTIVITIES事件監控器收集到。

每個閾值都有一個應用範圍。閾值的作用域定義其可以操作的資料庫物件。只有在該閾值範圍內發生的動作才會受其影響。閾值的作用域可以是:

Ø         資料庫(Database)

Ø         服務父類(Service superclass )

Ø         服務子類(Service subclass )

Ø         工作動作(Work action )

Ø         工作負載(Workload )

 

閾值即可以是predictive ,也可以是reactive,也就是說,我們可以定義閾值是前觸發還是後觸發

Ø         前觸發閾值是在相應的工作開始之前進行檢查。資料伺服器通過SQL編譯器得到使用資源的估計值,檢查前觸發閾值是否會被觸發。

Ø         後觸發閾值是在相應的工作開始之後進行檢查的。通過對控制資源的大體執行時間使用估計,來評估是否達到了後觸發閾值的邊界。執行時間使用估計不是連續獲得的,而是在每個(特定工作生命週期中)預先選擇的檢查點進行獲取。

需要注意的是,閾值不是適合所有的語句,比如,閾值不能應用在COMMIT,ROLLBACK, SAVEPOINT以及 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錯誤,閾值無法建立,因為它違反了限制。這個條件在協調器資料庫分割槽上是被強制執行的。被這個條件跟蹤的活動有:

n         DML協調器活動

n         那些被使用者邏輯呼叫的巢狀DML活動。因此,那些可以被資料庫管理器初始化的DML活動(比如,實用程式,儲存過程,嵌入式SQL等)都不會被這個條件跟蹤(除非他們的開支是被包含在他們的呼叫者評估上的,也就是間接被跟蹤)。

Ø         SQLROWSRETURNED > integer-value

這個條件定義了返回給(應用伺服器上的)應用客戶端的行數上限。條件值可以是任何非零正整數(如果違反,則會報SQLSTATE 42820)。這個條件的定義域(definition domain)必須是資料庫(DATABASE),工作動作(WORK ACTION),服務父類(SERVICE SUPERCLASS),或者服務子類(SERVICE SUBCLASS),而且其執行範圍(enforcement scope)必須是資料庫(DATABASE),如果違反了,將報SQLSTATE 5U037錯誤,閾值無法建立,因為它違反了限制。這個條件在協調器資料庫分割槽上是被強制執行的。被這個條件跟蹤的活動有:

n         DML協調器活動;

n         那些源自使用者邏輯巢狀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錯誤,閾值無法建立,因為它違反了限制。這個條件將在協調器資料庫分割槽上作為邏輯條件被強制執行。以下活動將被這個條件跟蹤:

n         DML協調器活動和相應的子代理工作(subsection execution);

n         那些源自使用者邏輯巢狀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命令成功完成。

 

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9524210/viewspace-511958/,如需轉載,請註明出處,否則將追究法律責任。

相關文章