source:
http://www-01.ibm.com/support/docview.wss?uid=csc10fee3a9e98c4f1d848256fd30056f199
Document #: 2817545C30000
Body:
[標題] 關於 Unix 系統下 DB2 分區內並行性方式對應用程序的處理
內容提要:
主要介紹了 Unix 操作系統下,DB2 分區內並行方式的啓用及其與代理進程相關的處理。
說明:
DB2 並行性功能可使 DB2 的一條任務分爲多個組成部分,以同時實現各部分的並行處理,從而大幅提高了 DB2 數據庫整體性能以及正常的管理工作性能。DB2 支持如下類型的並行性:
·I/O ·查詢 ·實用程序
對於其中查詢的並行性又分爲:查詢間並行性(inter-query parallelism)和查詢內並行性(intra-query parallelism)兩種。前者指數據庫同時接受多個應用程序查詢的能力。每個查詢以獨立於其它查詢的方式運行,但 DB2 同時運行所有查詢,DB2 始終支持這種類型的並行性;後者則指使用分區內並行性和/或分區間並行性來同時處理單個查詢的各部分,即將一個查詢分成多個部分,每個部分被同時並行執行的功能。對於具有多個處理器的對稱多處理服務器上的非分區式數據庫,啓用分區內並行的功能可以令一條任務被分的各組成部分,分別同時執行在各處理器,從而提高了整個任務的執行性能。
如圖-1所示,一條查詢語句被分成四個部分同時並行處理,使返回查詢結果的速度比整條語句串行處理快了許多。
圖-1. 以分區內並行性方式處理查詢語句
這裏我們就對啓用了分區內並行性的情況下 DB2 對應用程序的處理處理加以說明。
一. 啓用 DB2 分區內並行性:
要啓用 DB2 的分區內並行性,首先要將數據庫管理器配置文件中的 INTRA_PARALLEL 參數設置爲"YES"。即:
db2 UPDATE DBM CFG USING INTRA_PARALLEL YES
啓用該參數後,可使 DB2 的某些操作,如創建索引,導入數據,SQL 查詢等實現並行處理。
對於控制並行作業數目的並行度,可通過以下參數分別設置在不同的級別上:
實例級 - MAX_QUERYDEGREE(數據庫管理器配置參數) 數據庫級 - DFT_DEGREE (數據庫配置參數) 動態 SQL 語句 - CURRENT DEGREE(由 SET CURRENT DEGREE 設置) 靜態 SQL 語句 - DEGREE(由 PREP 或 BIND 的 DEGREE 選項設置) 運行的應用程序 - RUNTIME DEGREE(由 SET RUNTIME DEGREE 命令設置) CLI 配置文件 - DB2GREE(在 db2cli.ini 文件中設置)
如果設置爲“ ANY",即表示由優化器決定併成程度;若爲一指定的值,則表示一個任務最多可實現的並行處理數目。
二. 分區內並行性環境下代理進程的處理:
當某個應用程序連接至一個非分區式數據庫時,該連接將被分配一個唯一的協調代理進程,用於代表它的應用程序執行所有的數據庫請求,並與其它代理進程進行通信。如果啓用了分區內並行性,協調代理進程在執行語句時將根據存取方案及數據庫和實例的配置參數決定並行度,然後產生 N 個存取方案的拷貝,將它們分別分配給獲取到的 N 個子代理進程進行並行處理,協調代理進程負責協調執行數據庫請求的各子代理進程。
在 Unix 環境下,DB2 的協調代理進程和子代理進程的進程名是不同的,協調代理進程爲 db2agent,子代理進程分別爲:db2agnts(空閒的代理進程)和 db2agntp(工作的代理進程)。見圖-2中舉例所示:
圖-2. 空閒的子代理進程與工作的子代理進程
圖中分別有 A 和 B 兩個應用程序,A 程序爲執行其 SQL 語句,並行使用了三個 db2agntp 子代理進程,B 程序僅使用了一個 db2agntp 子代理進程,而代理進程緩衝池中有三個空閒的子代理進程 db2agnts。由於這四個 db2agntp 子代理進程均與其協調代理進程相關聯,所以也稱爲相關代理進程。
如果當 B 程序完成了 SQL 語句的處理,其相關代理進程將變爲空閒,放入代理進程緩衝池中,但由於它有可能爲後續的 SQL 語句所重用,因此會依然保持與 B 程序的協調代理進程的關聯。如果中斷這一相關性,而將其釋放爲空閒代理進程,將會降低後續 SQL 語句的處理性能。
同理,對於 A 程序,如果下一條語句僅需要兩個 db2agntp,則會有一個子代理進程變成空閒但仍然保持與 A 程序協調代理進程的關聯。此時,從應用程序 A 的角度來看,各代理進程的狀態會呈現如圖-3中所示的情況:
圖-3. 應用程序 A 及其代理進程的狀態
上圖中,A 程序擁有一個協調代理進程,兩個活動子進程,一個空閒且相關的代理進程,和一個對 A 程序而言雖爲空閒但與程序 B 相關的代理進程,以及三個真正空閒(空閒且不與其它程序相關)的空閒代理進程。
假如當前運行於 A 程序上的語句結束,而下一條語句需要的並行度爲 8,即需要 8 個並行的子代理進程來完成時,協調代理進程將需要獲取額外的子代理進程,則其激活和獲取所需子代理進程的順序將會以最佳地利用當前的代理進程和可用資源的邏輯進行。這裏 A 程序的協調代理進程獲取額外子代理進程的順序爲:
1. 將當前與其應用程序相關的空閒子代理進程轉化爲其活動子代理進程。 2. 將未與其它應用程序相關的空閒子代理進程轉化爲其活動子代理進程。 3. 將當前與其它應用程序相關的空閒子代理進程轉化其活動子代理進程,即竊用其它應用程序的相關代理進程。 4. 創建新的進程作爲其代理進程。
在本例中,爲執行新的 SQL 語句,A 程序的協調代理進程還需要 6 個額外的活動子代理進程,因此該轉化的過程和順序爲,激活一個 A 程序的相關子代理進程,與三個空閒代理進程建立相關性並激活,除去與 B 程序相關的那個空閒子代理進程的相關性,再建立與 A 的關聯,然後激活該子代理進程,另外還需要創建一個新的代理進程,然後建立與 A 程序的相關性並激活它。
由此可見,對於一個大而複雜的查詢,啓用分區內並行性將有助於提高程序的性能。但如果對於一個典型的 OLTP 環境,其中常有成百個甚至更多的並行運行着的應用程序,若每個程序再分成由多個代理進程處理的多個部分,系統上會由於存在過多的代理進程,而導致大量的系統開銷,因此,對分區內並行性的啓用要根據用戶具體的應用程序和系統資源進行選擇,以便達到提高 DB2 數據庫系統整體性能的目的。
參考資料:
|