并行資料庫盤诘和MemoryGrantManager,PDQ,并行資料庫盤诘(Paralleldatabasequery,PDQ)是IDS從7.3版末尾引入的聽命。Informix資料庫供職器的這個
并行資料庫盤诘和 Memory Grant Manager
PDQ
并行資料庫盤诘(Parallel database query,PDQ)是 IDS 從 7.3 版末尾引入的聽命。Informix 資料庫供職器的這個特征可以大大進步性能。PDQ 使資料庫供職器可以分散盤诘的任務。歧,若是須要在一個大型表上設立建設索引,那麼可以将這項任務分散到多個線程和曆程。
分派和限定 PDQ 資本
PDQ 包含資本處置聽命。
當資料庫供職器哄騙 PDQ 并行實驗一個盤诘時,可以在壟斷體系上實驗較重的負載。可以調優以下資本:
- 記憶體
- CPU VP
- 磁盤 I/O(關于分段表和臨時表空間)
- 掃描線程
在設定裝備安插資料庫供職器時,必須思索 PDQ 的哄騙對其他使用者的影響。歧,若是運轉的盤诘要占用一切 CPU 資本,那麼資料庫供職器就不能對其他常常運轉得十分快的盤诘作出相應。是以必須小心,使要害的非 PDQ 盤诘仍然可以以可以接管的性能運轉。
可以用以下要領控制資料庫供職器對資本的哄騙:
- 限定并行資料庫盤诘的優先級
- 調解排遣 Memory Grant Manager 中的記憶體巨細
- 限定掃描線程的數目
- 限定并發盤诘的數目
PDQPRIORITY
現象變量确定資本的并行度,它和
MAX_PDQPRIOIRTY
一路用作關于資料庫供職器若何分派資本的比例因子。
清單 9. 設定 PDQPRIORITY 現象變量setenv--PDQPRIORITY-- -HIGH------------------------------- -
-LOW--------------------------------
-OFF--------------------------------
'-resources-- --------------------- -'
| (1) |
'----------high_value-'
表 6. PDQPRIORITY 設定 設定
描畫
High
當資料庫供職器在一切效戶之間分派資本時,它将盡大約多的資本供應給盤诘
Low 或 1
并行地從分段表中取資料值
OFF
PDQ 處置被關閉
resources
0 到 100 之間的整數;設定抱負分派給盤诘的使用者苦求的 PDQ 資本的百分比
可選的較高值
苦求最大百分比的記憶體的可選整數值。當在 resources 值之後指定這個值時,将苦求用百分比表達的一定局限的記憶體
資料庫供職器公用于一個盤诘的資本越多,常常就能越快地完成盤诘。然則,若是其他盤诘也檢驗檢驗擷取那些相反的資本,就會發生發火對那些資本的競争。這會招緻性能降落。
可以哄騙 SQL 語句
SET PDQPRIORITY
手動調解排遣特定會話的優先級。
用 MAX_PDQPRIORITY 限定優先級限定資料庫供職器可分派給随意 DSS 盤诘的 PDQ 資本的 onconfig 參數是
MAX_PDQPRIORITY
。
MAX_PDQPRIORITY
用作任何特定客戶機苦求的資本占
PDQPRIORITY
的百分比。歧,假定一個使用者急于得到資料,是以将
PDQPRIORITY
設為 100。然則 DBA 認識到每天早晨的同一個時分須要運轉一些批處置任務,是以将
MAX_PDQPRIORITY
設為 50。100 的 50% 是 50,是以使用者抱負上可以得到的最大
PDQPRIORITY
資本數為 50。
當資料庫供職器聯機時,可以哄騙
onmode -D
改削
MAX_PDQPRIORITY
的值。
在同時具有 OLTP 和 DSS 盤诘的體系上,必須接納均衡步履。若是
MAX_PDQPRIORITY
設定得太高,則倒運于 OLTP 盤诘。若是
MAX_PDQPRIORITY
設定得太低,則 DSS 盤诘不能得到令人稱心的性能。是以,DBA 必須小心腸調優這個變量。
可以将
MAX_PDQPRIORITY
設定為表 7 中描畫的以下值:
表 7. MAX_PDQPRIORITY 設定關閉 PDQ。DSS 盤诘倒運用并行
1
并行地從分段表中取資料(并行掃描),然則倒運用其他方式的并行
100
哄騙一切可用的資本并行地處置盤诘
随意數值
0 到 100 之間的一個整數;設定抱負分派給盤诘的使用者苦求的 PDQ 資本的百分比

用 Memory Grant Manager 調解排遣記憶體資本
DS_TOTAL_MEMORY onconfig
參數指定可用于 PDQ 盤诘的記憶體巨細。這個值單元為 KB。
DS_TOTAL_MEMORY
應該被設定得足夠大,以便可以一次性地将較大的任務裝入記憶體。然則,在設定裝備安插
DS_TOTAL_MEMORY
時須要思索以下方面:
- 計較機上的總記憶體巨細 -- 不要超越它
- 開支,歧緩沖池
- 計較機上的其他曆程。若是因為這個值設定得太高而招緻換頁或交流,則會淘汰性能優勢,抱負上反而降低了性能
SHMTOTAL
指定用于資料庫供職器的一切記憶體(常駐記憶體、編造記憶體和舊事記憶體這幾局部的總和)。
SHMVIRTSIZE
指定共享記憶體中編造記憶體的初始巨細。
一切分派給
DS_TOTAL_MEMORY
的記憶體都在共享記憶體的編造記憶體中。某些壟斷體系關于每個添加到共享記憶體的附加段有一定的性能開支。是以應适外埠調優
SHMVIRTSIZE
和
SHMTOTAL
,以分派較多數目标段。
關于 OLTP 使用序次,基本提議是将
DS_TOTAL_MEMORY
設定為
SHMTOTAL
值的 20% 到 50%,單元為 KB。
若是 DSS 盤诘獨占地哄騙資料庫供職器,則将
DS_TOTAL_MEMORY
SHMTOTAL
的 90% 到 100%。
關于同時哄騙兩種典範的盤诘的體系,基本提議是将
DS_TOTAL_MEMORY
SHMTOTAL
的 50% 到 80%。
可以用
onmode -M
敕令靜态地設定
DS_TOTAL_MEMORY
細緻: DS_TOTAL_MEMORY
允諾哄騙的值與平台有關。關于 32 位平台,這個值必須是 128 * DS_MAX_QUERIES 到 1,048,576 之間的一個無辨別表記标幟整數。而在 64 位體系上,限定局限常常更大一些,并且因壟斷體系而異。歧,在 HP 9000 平台上,最大值是 4,294,967,296。

DS_MAX_SCANS ONCONFIG
參數限定可以并發運轉的 PDQ 掃描線程的數目。若是這個參數設定得太高,那麼資料庫供職器就有太多來自多個并發運轉的抉擇貪圖支撐盤诘的掃描線程。這将招緻資本競争和停當行列增進,因為掃描線程會等待機緣末尾任務。
可以哄騙下面的公式計較分派給一個盤诘的掃描線程的數目:
清單 10. 計較分派給一個盤诘的掃描線程的數目scan_threads = min (nfrags, (DS_MAX_SCANS * pdqpriority /
100 * MAX_PDQPRIORITY / 100) )
表 8. 公式中的各項 項
nfrags
具有最大數目标片段的表中的片段的數目
用于阿誰特定盤诘的
PDQPRIORITY
可以哄騙
onmode -S
選項靜态地設定最大數目标掃描線程。
這個值必須是 10 到 1,048,576 之間的一個無辨別表記标幟整數。
歧,假定一個大型表包含 50 個片段。若是沒有設定
DS_MAX_SCANS
,那麼資料庫供職器将分派 50 個掃描線程。是以,引擎将檢驗檢驗運轉 50 個掃描線程讀這個表。
現在,假定這是任何使用者都可以運轉的一個述說。若是 50 個人檢驗檢驗運轉阿誰述說會如何呢?引擎将為阿誰述說的每次運轉分派 50 個線程。是以,一共要派生 2500 個線程。若是增進其他述說和其他 DSS 盤诘的開支,可以看到存在很多競争。
DS_MAX_SCANS
就是用于處置這個成就。
和所無性能方面的思索一樣,這是一種均衡步履。為了淘汰大型盤诘的掃描線程在停當行列中的等待時光,可以淘汰分派的掃描線程數目。然則,若是一個盤诘的掃描線程數目少于片段數目,盤诘須要花更長的時光實驗。

限定并發 PDQ 盤诘的數目
DS_MAX_QUERIES
是指定可以并發運轉的 PDQ 盤诘的最大數目标
ONCONFIG
參數。Memory Grant Manager (MGM) 依據清單 11 中的公式為一個盤诘預留記憶體。下面的公式也诠釋資料庫供職器若何決議将多少記憶體分派給一個盤诘:
清單 11. 為一個盤诘預留記憶體memory_reserved = DS_TOTAL_MEMORY *
(PDQ-priority / 100) *
(MAX_PDQPRIORITY / 100)
onmode -Q
靜态地設定
DS_MAX_QUERIES

Memory Grant Manager
onstat -g mgm
選項列印 Memory Grant Manager (MGM) 資本資訊。可以哄騙
onstat -g mgm
選項看守 MGM 若何諧和記憶體哄騙和掃描線程。
讓我們看看一個示例輸入:
清單 12. onstat -g mgm 的示例輸入IIBM Informix Dynamic Server Version 11.10.FB5TL -- On-Line -- Up 10 days 01:35:2
7 -- 61440 Kbytes
Memory Grant Manager (MGM)
--------------------------
MAX_PDQPRIORITY 50
DS_MAX_QUERIES: 2
DS_MAX_SCANS: 1048576
DS_NONPDQ_QUERY_MEM: 128 KB
DS_TOTAL_MEMORY: 256 KB
Queries: Active Ready Maximum
0 0 2
Memory: Total Free Quantum
(KB) 256 256 128
Scans: Total Free Quantum
1048576 1048576 1
Load Control: (Memory) (Scans) (Priority) (Max Queries) (Reinit)
Gate 1 Gate 2 Gate 3 Gate 4 Gate 5
(Queue Length) 0 0 0 0 0
Active Queries: None
Ready Queries: None
Free Resource Average # Minimum #
-------------- --------------- ---------
Memory 0.0 - 0.0 32
Scans 0.0 - 0.0 1048576
Queries Average # Maximum # Total #
-------------- --------------- --------- -------
Active 0.0 - 0.0 0 0
Ready 0.0 - 0.0 0 0
Resource/Lock Cycle Prevention count: 0
門 Memory Grant Manager 操作一系列的門以確定 PDQ 盤诘有足夠的資本以适外埠運轉。
表 9. 門描畫門号
能否有足夠的可用記憶體?
2
能否超越了 DS_MAX_SCANS?
3
這個門是一切具有相反優先級的盤诘的一個行列
4
能否超越了 DS_MAX_QUERIES?
5
確定在允諾行列運轉之前不靜态變動資本
份額在
onstat -g mgm
輸入顯示的一種資本中,一個單元的記憶體稱作一個份額(quantum)。記憶體份額洩漏顯示一個單元的記憶體:
份額是在分派記憶體時确定的。它不是一個靜态的巨細。
清單 13. 份額界說memory quantum = DS_TOTAL_MEMORY / DS_MAX_QUERIES
memory quantum = (256 * 1024) / 2