Informix PDQ 初學

liahtobjtosh發表於2010-06-28
PDQ(Parallel database query):並行資料庫查詢[@more@]

PDQ(Parallel database query):並行資料庫查詢
一、幾個與並行查詢相關的配置引數或環境變數

1: DS_MAX_QUERIES 配置引數
指定: 可以併發執行的 PDQ 查詢的最大個數。也即同一時刻大於 0 的 PDQ 查詢的總數不能超過 DS_MAX_QUERIES
範圍: 1至8M
初始值: 無
預設值: CPU VP * 2 * 128
動態修改: onmode -Q

2: DS_MAX_SCANS 配置引數
指定:一個查詢可用的最大掃描執行緒個數
範圍: 10至1M
初始值: 有 = 1M
動態修改: onmode -S
DBA應將 DS_MAX_SCANS 設定成一個較少的數,以防止IDS所需要的掃描執行緒數目過多。如果一個表有100個分段,並且使用系統預設值 DS_MAX_SCANS (1M),那麼IDS將會併發100個掃描執行緒來讀取該表。如果 DS_MAX_SCANS = 20,則可以確保 IDS 為並行掃描最多併發執行 20 個掃描執行緒。

3: MAX_PDQPRIORITY 配置引數
指定: PDQ 可獲取的最大資源的百分比。
範圍: 0至100
初始值: 有 = 100
動態修改: onmode -D
如果希望將更多的資源分配給OLAP,請減少 MAX_PDQPRIORITY 的值。

4: DS_TOTAL_MEMORY 配置引數
指定:所有並行查詢可以使用的全部虛擬記憶體數量。
範圍: 128*DS_MAX_QUERIES 至 1M(32位) 或 4G(64位)
初始值:無
預設值:如果 SHMTOTAL=0,並設定了 DS_MAX_QUERIES ,則 DS_TOTAL_MEMORY = DS_MAX_QUERIES * 128
如果 SHMTOTAL=0,但沒設定 DS_MAX_QUERIES ,則 DS_TOTAL_MEMORY = CPU VP * 128 * 2
動態修改: onmode -M
如果監控 OS 時,發現頁面排程增加時(即OS記憶體不足),則需降低 DS_TOTAL_MEMORY 的值,以保證OLAP可以繼續。

5: PDQPRIORITY 環境變數
或者 set PDQPRIORITY 語句
指定:當前查詢最終可以使用的資源數(也即優先順序)
範圍:-1 至 100

set PDQPRIORITY default:使用環境變數 PDQPRIORITY 指定的值

二、 哪些操作支援並行
IDS 採用以下兩個步驟處理 insert update insert 操作:
步驟1: 取來符合條件的行;

步驟2: 執行 insert update insert 操作

所以:
1: delete 操作
IDS 可以並行執行步驟1

2: insert 操作
SELECT...INTO TEMP 和 INSERT INTO...SELECT 操作都可能被並行處理。其中 INSERT INTO...SELECT 的目的表可以是永久表或臨時表

3: 建立索引

4: 相關子查詢不能使用 PDQ,但不相關子查詢可能使用 PDQ
所在IBM建議:只要有可能就用連線代替子查詢

5: 對於排序、雜湊連線和group by 的操作,PDQ 將會有非常高的效能提升

但 UPDATE STATISTICS 不能並行處理

三、MGM(Memory Grant Manager):記憶體分配管理器
1: 因為 PDQ 會涉及到記憶體, CPU VP,掃描執行緒和磁碟I/O,所以IDS就有一個元件: MGM 用來協調這些資源。
MGM 可以管理並分配的資源包括:
每個查詢的掃描執行緒的數量
每個查詢的執行緒數量
每個查詢所佔用的記憶體數量

2: 份額(Quantum)的概念
就像給表分配儲存空間時使用Page的概念一樣,在 PDQ 中分配記憶體的最小單位是份額。一個份額的大小= DS_TOTAL_MEMORY / DS_MAX_QUERIES
一般而言,Quantum 越小,記憶體分配效率越高。從上可知可以透過增加 DS_MAX_QUERIES 以減少一個記憶體份額的大小來提高併發查詢的效能。

3: 一個查詢可以啟動的最大掃描執行緒的數量
scan_threads = min (nfrags, DS_MAX_SCANS * (pdqpriority / 100) * (MAX_PDQPRIORITY / 100) )
nfrags: 當前查詢中所有分段表的最大分段個數。
例:
如果一個表有100個分段,並且使用系統預設值 DS_MAX_SCANS (1M),那麼IDS將會併發100個掃描執行緒來讀取該表。

4: 一個查詢可以使用的記憶體
等於 DS_TOTAL_MEMORY * MAX_PDQPRIORITY% * pdqpriority%。然後四捨五入的換成N個 Quantum 。
例:如果 MAX_PDQPRIORITY = 80,當前查詢的 pdqpriority = 50,則當前查詢可以獲得 80%*50%=40%的 DS_TOTAL_MEMORY 記憶體量。
所以如果透過把環境變數 PDQPRIORITY 設定成 90,則很可能會造成 208 錯誤。因為一個Session就佔用了 90% 的PDQ記憶體,每二個Session只能等待第一個Session釋放記憶體。一般最好在會話中設定 PDQPRIORITY 來提高效能,否則後果很嚴重。

注:
1、 在PDQ官方文件中,經常看到“保留”這個字,我一般會它理解成“申請”
2、 環境變數 PDQPRIORITY 在官方文件中是優先順序的含義,但大多數情況下還有資源申請百分比的意思。可以理解如果希望得到的資源越多,它的優先順序就越高。
3、 IDS首先透過 DS_TOTAL_MEMORY/DS_MAX_QUERIES 申請到 N 個名為“份額”的記憶體單元(N = DS_TOTAL_MEMORY * MAX_PDQPRIORITY% * pdqpriority% / (DS_TOTAL_MEMORY/DS_MAX_QUERIES)=DS_MAX_QUERIES * MAX_PDQPRIORITY% * pdqpriority%),當使用者發出查詢時,IDS將分配上面申請到的記憶體給當前查詢。

4、 從 set explain 的結果可以顯示是否使用了並行掃描,響應查詢所需的最大執行緒數以及查詢的連線型別。如果開啟 PDQ,且最佳化器選擇了並行掃描,則輸出 Parallel ,其中 #of Secondary Thread 為除了使用者會話執行緒以外所需要的執行緒數量,所以必需的執行緒總數為 #of Secondary Thread + 1。如果關閉了 PDQ,則輸出 Serial。
5、 如果一個 session 有 N 個執行緒,則 onstat -u 則表明該會話正在執行決策支援查詢(見《效能》P306即12章的第16頁)
6、 在 onstat -g ath 的執行緒角色列(name)指明瞭該執行緒是否為掃描執行緒。
7、 在 onstat -g ses 的結果中顯示每個會話分配的記憶體,使用的記憶體,啟動的執行緒數。
8、 共享記憶體(SHMTOTAL)=常駐記憶體+虛擬記憶體(SHMVIRTSIZE)+訊息部分,而 DS_TOTAL_MEMORY 是虛擬記憶體的一部分。如果透過 onmode -M 增加 DS_TOTAL_MEMORY ,則透過 onstat -g seg 可能看到標誌為V的記憶體有對應的增加。因為 DS_TOTAL_MEMORY 不佔用 BUUFERS 所使用的常駐記憶體記憶體,所以在不能重啟IDS增加buffer時,可以試圖使用 onmode -M 來加快查詢。但注意 HPL 使用 BUUFERS ,而其它裝載方法可以使用 PDQ 來改善效能。()
9、一些建議值:
對於OLTP系統:一般 DS_TOTAL_MEMORY 為 SHMTOTAL 的20%至50%。即把儘可能多的記憶體分配給 BUFFERS,而避免使用 PDQ,
對於DSS系統:一般 DS_TOTAL_MEMORY 為 SHMTOTAL 的50%至80%
對於專用DSS系統: DS_TOTAL_MEMORY 可以為 SHMTOTAL 的90%以上,但要小於 SHMTOTAL - 10MB.
10、一些建議:
(1) PDQPRIORITY * (MAX_DS_QUERIES/2) = 100
(2) 使用 PDQ後發現效能變差了。如果使用了索引,可以試圖drop index,然後執行 Update Statistics 看一下結果,情況可能會變好。
(3) 經常 Update Statistics
以上參考: 的第7部分: Final Tips

11、可以使用 onstat –g mgm 監控 MGM 的情況。

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