第11章 性能調優
11.1 Nest vs merge vs hash join
DB2 UDB 優化器可以在執行連接時選擇不同方法:在缺省情況下,它在嵌套循環連接(nested loop join)與合併連接(merge join)之間選擇。當設置了特殊環境變量時,它還可以選擇散列連接(hash join)。散列連接可顯著提高某些查詢的性能,在決策支持系統(Decision Support System,DSS)環境中尤為突出,因為該環境中的查詢比較複雜。
連接方法
在連接兩個表時,無論使用哪種連接方法,總有一個表被選為外表(outer table)而另一個表被選為內表(inner table)。優化器根據所選連接方法的成本和類型決定哪個是外表、哪個是內表。首先訪問外表,並且只掃描一次。根據連接的類型和存在的索引,可以多次掃描內表。還有一點也很重要,要記住即使您試圖連接兩個以上的表,優化器也將每次只連接兩個表,並在必要時保存中間結果
Nested loop join
嵌套循環連接
正如我們前面提到的那樣,外表只被掃描一次。對於嵌套循環連接,要在內表中找到與外表中每一行相匹配的行有兩種方法:
掃描內表。即,讀取內表中的每一行,並且針對該行決定是否應將其與正在考慮的外表中的行相連接。
對內表上的連接列進行索引查找。當用於連接的謂詞所包含的列在內表的索引中時,這種方法是可行的。這極大地減少了在內表中訪問的行數。
在嵌套循環連接中,決定哪個是外表、哪個是內表非常重要,因為外表只掃描一次,而針對外表中的每一行,都要訪問一次內表。正如前面提到的那樣,優化器用成本模型來決定誰是外表誰是內表。優化器做此決定時會考慮幾個因素:
表的大小
緩衝
謂詞
排序要求
是否存在索引
Merge join
合併連接需要一個等式連接謂詞(即具有 table1.column = table2.column 格式的謂詞)。它還要求根據連接列對輸入表進行排序。通過掃描現有索引或在進行連接之前對錶進行排序就可以做到這一點。連接列不能是 LONG 或 LOB 字段。
同時掃描兩個表,以查找匹配行。外表和內表都只掃描一次,除非外表中有重複的值,那樣的話可能要再次掃描內表的某些部分。因為表通常只被掃描一次,所以決定哪個是外表、哪個是內表不象在其它連接方法中那麼重要。儘管如此,由於可能有重複的值,所以優化器通常選擇重複值較少的表作為外表。但是,優化器最終還是使用成本模型來決定誰是外表誰是內表。
Hash join
散列連接需要一個或多個等式連接謂詞,其中每個謂詞的列類型相同。就 CHAR 類型而言,長度必須相同。就 DECIMAL 類型而言,精度和小數位必須相同。同樣,連接列不能是 LONG 或 LOB 字段。散列連接可處理多個等式謂詞這一事實相對於合併連接是一大優勢,後者只能處理一個等式謂詞。
對於散列連接,首先掃描內表(也稱為構建表,bulid table),表中的行被複制到內存緩衝區。根據”散列代碼(hash code)”,這些緩衝區被分為幾個分區,散列代碼是根據連接謂詞中的列計算出來的。如果內存中沒有足夠的空間容納整個表,則有些分區被寫入磁盤上的臨時表。然後掃描外表(稱為探測表,probe table)。對於探測表中的每一行,對連接列應用同一散列算法。如果所獲得的散列代碼與構建行的散列代碼相匹配,則比較實際的連接列。如果與探測錶行匹配的分區在內存中,則比較會立即進行。如果分區被寫入臨時表,則探測行也被寫入臨時表。最後,處理包含同一分區中的行的臨時表以進行匹配。
由於將構建表保存在內存中所具有的好處,優化器通常選擇較小的表作為構建表,以避免必須將該表溢出(spill)到磁盤上。但是,要再次強調的是,成本模型最終決定哪個表是內表、哪個表是外表。
11.2 Os性能監控
以下的部分是對操作系統性能的基本分析,可以從中確定一些性能方面的問題。這個分析使用的是操作系統的工具: sar/vmstat . 主要從以下方面來檢查操作系統的性能。
1. CPU 利用率
2. Paging
4. IO
(這部分的檢查並不是針對操作系統或硬件的全面深入的檢查,如有上述要求請與操作系統廠商聯繫)
11.2.1 CPU
以下是jfzk的CPU的使用情況,檢查工具
1. topas/sar
2. vmstat
檢測指標:
Usr值範圍: 10<usr<94
sys值範圍: 10<usr<40
wio值範圍: 0 < wio <50
idle值範圍: 0 <idle<90
以上值採樣時間點:2007-11-04
11.2.2 內存
以下是jfzk的內存的使用情況,檢查命令:
vmstat /nmon/topas
檢測指標:
Comp: 72.7
Nocomp:24.2
Client: 23.6
Paging used:9.7
PgspIn:0 PgspOut:0
採樣 1:
Memory Use Physical Virtual Paging pages/sec In Out VM parameters
% Used 95.9% 9.3% to Paging Space 0.0 0.0 numperm 23.7%
% Free 4.1% 90.7% to File System 45.0 689.2 minperm 9.5%
MB Used 125726.9MB 9163.7MB Page Scans 1414.8 maxperm 23.7%
MB Free 5345.0MB 89652.3MB Page Cycles 0.0 minfree 120
total(MB) 131071.9MB 98816.0MB Page Reclaim 0.0 maxfree 128
採樣2:
kthr memory page faults cpu
r b avm fre re pi po fr sr cy in sy cs us sy id wa
23 3 24697016 1362185 0 0 4 71 58 0 14664 724366 63290 28 19 48 5
9 0 24690163 1368953 0 0 0 0 0 0 16114 923880 67963 12 23 64 1
14 1 24703249 1355334 0 0 8 0 0 0 17810 932035 72879 12 27 57 3
21 1 24652723 1405840 0 0 0 0 0 0 19611 958335 82503 15 40 41 4
14 1 24663848 1395149 0 0 15 0 0 0 18354 948783 75808 10 29 60 1
11.2.3 IO情況
以下是jfzk的IO的使用情況,檢查命令:
iostat/vmstat/sar/nmon
檢測指標:
tm_act值範圍: 0.4 < tm_act<4.5
R+w值範圍: 20M/s<r+w<1400M/s
11/19號採樣1:
tty: tin tout avg-cpu: % user % sys % idle % iowait
1.7 152.6 27.8 19.5 47.9 4.8
Adapter: Kbps tps Kb_read Kb_wrtn
scsi2 30.5 1.2 391919335 68688586
Paths/Disk: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk2_Path0 0.5 30.5 1.2 391919335 68688586
Adapter: Kbps tps Kb_read Kb_wrtn
scsi0 52.6 9.6 224101529 570630285
Paths/Disk: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk0_Path0 4.5 52.6 9.6 224101529 570630285
Adapter: Kbps tps Kb_read Kb_wrtn
scsi1 39.3 9.3 22680533 570630285
Paths/Disk: % tm_act Kbps tps Kb_read Kb_wrtn
hdisk1_Path0 4.5 39.3 9.3 22680533 570630285
Adapter: Kbps tps Kb_read Kb_wrtn
fcs2 10862.6 252.7 116795691344 47396030011
11/19號採樣2:
dapter I/O read write xfers Disks Adapter Type
scsi2 3b-08 0.0 43.9 KB/s 11.0 1 N/A
scsi3 3s-08 0.0 43.9 KB/s 11.0 1 N/A
fscsi0 2V-08-01 116367.4 73455.0 KB/s 4677.4 163 N/A
fscsi1 2k-08-01 120752.3 80587.4 KB/s 4846.6 163 N/A
fscsi2 31-08-01 119684.0 77624.2 KB/s 4825.7 163 N/A
fscsi3 3F-08-01 112106.3 78173.3 KB/s 4649.5 163 N/A
scsi0 2s-08 0.0 61.9 KB/s 15.5 1 N/A
scsi1 37-08 0.0 61.9 KB/s 15.5 1 N/A
TOTALS 8 adapters 468910.1 310051.6 KB/s 19052.1 656 R+W=760.7 MB/s
11.3 指標監控
11.3.1 BPHR
緩衝池一:BP32
Buffer pool data logical reads = 22387318588
Buffer pool data physical reads = 729703541
Buffer pool index logical reads = 7098769339
Buffer pool index physical reads = 15869646
以下文章點擊率最高
Loading…