本文專為 IBM DB2 Universal Database for Linux、UNIX 和 Windows 撰寫。
對於剛踏入 DB2 領域的 DBA 或未來 DBA 而言,新資料庫的設計與效能選擇可能令人困惑。本文討論 DBA 必須做出重要選擇的兩個面向:表空間與緩衝池。表空間與緩衝池的設計調優對 DB2 伺服器效能有深遠影響,因此重點討論這些活動。示例使用 DB2 V8.1 企業伺服器版,大多數也適用較低版本,會標註僅適用 V8.1 的範例。
第 1 節定義表空間類型,說明 DB2 如何將資料儲存於表空間,介紹配置選項與建立管理流程。接著著重緩衝池,介紹其概念與建立使用。第 2 節結合兩面向,討論如何組織緩衝池與表空間以獲最佳效能。
資料庫中所有資料儲存於多個表空間。可視表空間為孩子、資料庫為父母,表空間不能有多個資料庫。根據用途與管理方式分類。按用途有五種表空間:
CREATE DATABASE 時建立,命名為 SYSCATSPACE,保存系統目錄表。USERSPACE1。TEMPSPACE1。兩種管理方式:
ALTER TABLESPACE 擴展容器。V8 起可釋放未使用的 DMS 容器部分。擴大容器大小範例(V7、V8 均支援):
ALTER TABLESPACE TS1
RESIZE (FILE '/conts/cont0' 2000,
DEVICE '/dev/rcont1' 2000,
FILE 'cont2' 2000)
注意:僅 V8 支援將原始容器調整得更小。
建立資料庫時自動建立三個表空間(SYSCATSPACE、TEMPSPACE1、USERSPACE1)。用 DB2 Command Window 或 UNIX 命令列:
CREATE DATABASE testdb
CONNECT TO testdb
LIST TABLESPACES
輸出見清單 1。可用 CREATE DATABASE 包含表空間描述覆蓋預設建立,但建立資料庫時必須建立目錄表空間、至少一個常規表空間、至少一個系統暫存表空間。可用 CREATE DATABASE 或稍後 CREATE TABLESPACE 建立更多所有類型表空間(目錄表空間除外)。
每個表空間有一或多個容器。容器是孩子、表空間是父母。每容器僅屬一表空間,但一表空間可擁多容器。可向 DMS 表空間新增/刪除容器、更改容器大小。僅能向分區資料庫上尚未分配容器的分區新增 SMS 容器。新增容器時啟動自動重新平衡操作將資料分散到所有容器,不妨礙並發存取。
建立表空間時可指定多種設定,或稍後用 ALTER TABLESPACE 指定。
| 頁大小 | 列大小限制 | 欄數限制 | 最大容量 |
|---|---|---|---|
| 4 KB | 4,005 | 500 | 64 GB |
| 8 KB | 8,101 | 1,012 | 128 GB |
| 16 KB | 16,293 | 1,012 | 256 GB |
| 32 KB | 32,677 | 1,012 | 512 GB |
CREATE TABLESPACE USERSPACE3
PAGESIZE 8K
MANAGED BY SYSTEM
USING ('d:usp3_cont1', 'e:usp3_cont2', 'f:usp3_cont3')
EXTENTSIZE 64
PREFETCHSIZE 32
BUFFERPOOL BP3
OVERHEAD 24.1
TRANSFERRATE 0.9
LIST TABLESPACES SHOW DETAIL 顯示更多資訊。清單 2 為 USERSPACE1 輸出。列出容器需用 Tablespace ID:LIST TABLESPACE CONTAINERS FOR 2。清單 3 為輸出,路徑指向容器物理位置。
一個緩衝池關聯單一資料庫,可被多表空間使用。考慮將緩衝池用於一或多表空間時,必須確保表空間頁大小與緩衝池頁大小對所有被「服務」表空間相同。一表空間只能用一緩衝池。
建立資料庫時建立預設緩衝池 IBMDEFAULTBP,所有表空間共享。可用 CREATE BUFFERPOOL 新增。預設大小為 BUFFPAGE 參數指定,但可在 CREATE BUFFERPOOL 中用 SIZE 關鍵字覆蓋。足夠緩衝池大小是資料庫良好效能關鍵,因減少磁碟 I/O 這最耗時操作。大型緩衝池也影響查詢優化,因更多工作可在記憶體完成。
V8 允許保留緩衝池一部分(最高 98%)用於基於區塊的預取操作。基於區塊 I/O 透過將區塊讀入相鄰記憶體區而非分散裝入單獨頁,提高預取效率。每緩衝池區塊大小必須相同,由 BLOCKSIZE 參數控制。值為區塊大小(頁為單位),2 到 256,預設 32。
DB2 不將擴展儲存器用於緩衝區。但可用擴展儲存器快取記憶體頁,使從記憶體移出頁更快。
CREATE BUFFERPOOL BP3
SIZE 2000
PAGESIZE 8K
此緩衝池分配給上述 USERSPACE3,建立表空間前建立緩衝池。注意緩衝池與表空間頁大小皆 8K 相同。若建立緩衝池後建立表空間,可省略 CREATE TABLESPACE 中 BUFFERPOOL BP3。反之可用 ALTER TABLESPACE USERSPACE3 BUFFERPOOL BP3 將緩衝池加入現有表空間。
查詢 SYSCAT.BUFFERPOOLS 系統視圖列出緩衝池資訊。查詢 SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES 找出哪個緩衝池分配給表空間。
通常目錄表空間與系統暫存表空間作為 SMS 分配。無需多個相同頁大小暫存表空間,通常一個最大頁大小暫存表空間即夠。
關鍵問題在於是否將使用者資料分割到多表空間。考慮因素之一是頁利用率。列無法分割到不同頁,長列表需合適頁大小。但一頁上列不超過 255,短列表無法利用整頁。例:32K 頁大小表空間放置 12 位元組列長表,僅利用約 10% 頁空間。若表很大,浪費空間巨大,也降低 I/O 與快取效率。若能將表放入較小頁表空間,且能充分利用較大頁大小,最常用存取方式決定哪個更好。通常循序存取大量列(表可能已群集)較大頁大小較有效;隨機存取列則較小頁大小允許 DB2 更好利用緩衝區(相同儲存區域容納更多頁)。
依頁大小分組表後,存取頻率與類型決定是否進一步分組到獨立表空間。每表根據最頻繁存取方式可有一組最有效表空間設定:PAGESIZE、EXTENTSIZE、PREFETCHSIZE。EXTENTSIZE 為寫入下一容器前寫入當前容器頁數(多容器時)。PREFETCHSIZE 為執行資料預取時讀取頁數。管理器確定循序 I/O 適當且預取可能助效能時使用(通常大型表掃描)。較好做法將 PREFETCHSIZE 顯式設為 EXTENTSIZE 與容器數乘積倍數。例:EXTENTSIZE 32、4 容器,理想 PREFETCHSIZE 為 128、256 等。若一或多頻繁使用表需參數值不同於適用於表空間其他表的值,將其放入獨立表空間可能提升整體效能。
若預取操作是表空間重要因素,考慮保留部分緩衝區用於基於區塊 I/O。區塊大小應等於 PREFETCHSIZE。
使用多個使用者表空間最重要原因是管理緩衝區利用率。一表空間只能關聯一緩衝池,一緩衝池可用於多表空間。
緩衝池調優目標是幫助 DB2 盡可能好利用可用於緩衝區的記憶體。整個緩衝區大小對 DB2 效能有巨大影響,因大量頁可顯著減少 I/O 這最耗時操作。但若總緩衝區大小太大且無足夠儲存空間分配,將為每種頁大小分配最小緩衝池,效能急劇下降。計算最大緩衝區大小需考慮 DB2、作業系統與其他應用所有儲存器利用率。確定總可用大小後,可將此區域劃分成不同緩衝池提高利用率。若有不同頁大小表空間,每種頁大小至少需一緩衝池。
擁有多緩衝池可將資料保留在緩衝區。例:資料庫有許多頻繁使用小表,通常全在緩衝區中,存取極快。現假設有針對極大表運行查詢,用同一緩衝池需讀取超過總緩衝區大小的頁。查詢運行時,小表頁會丟失,再次需要時必須重讀。若小表擁有自己的緩衝池(故須有自己的表空間),大查詢無法覆蓋其頁。可能產生更好整體系統效能,雖對大查詢有小負面影響。調優常為整體效能提升在不同系統功能間權衡。區分功能優先級並記住總吞吐量與使用情況同時調整系統效能很重要。
V8 引入新功能可在不關閉資料庫情況下更改緩衝池大小。帶 IMMEDIATE 選項的 ALTER BUFFERPOOL 立即生效,只要資料庫共享記憶體有足夠保留空間分配新空間。可用此功能根據使用週期變化(如白天互動使用轉夜間批次工作)調優資料庫效能。
表分布到多表空間後必須決定物理儲存。表空間可儲存於多容器,可為 SMS 或 DMS。SMS 較易管理,對包含許多不同小表表空間(如目錄表空間)、特別是含 LOB 表表空間,SMS 可能不錯。為降低每次一頁擴展 SMS 容器開銷,應執行 db2empfa 指令,將 MULTIPAGE_ALLOC 設為 YES。
DMS 通常有更好效能,提供分別儲存索引與 LOB 資料靈活性。通常應將一表空間多容器分開放在單獨物理卷上,提高某些 I/O 平行性。多使用者表空間與多裝置時,應考慮應用程式邏輯,盡可能平均分配工作負載到這些裝置。
RAID 裝置有特殊考慮。EXTENTSIZE 應等於 RAID 條帶大小或其倍數。PREFETCHSIZE 應等於 RAID 條帶大小乘 RAID 平行裝置數(或該乘積倍數),此值應為 EXTENTSIZE 倍數。DB2 提供登錄變數增強特定環境。執行 db2set DB2_PARALLEL_IO=* 可在一容器啟用 I/O 平行性。DB2_STRIPED_CONTAINERS=ON 可將容器標記大小從一頁改為整個擴展區,使表空間擴展區與 RAID 條帶一致。
至於效能評估其他方面,知道某更改是否有益唯一穩妥方法是基準測試。物理組織更改時任務稍複雜,因更改表空間需付出相當精力。最實用方法是減少設計階段案例數,稍後需基準測試案例較少。只有效能極其重要且不同設計間可能存在顯著效能差異時,才值得花時間精力嚴格基準測試比較設計。應重點放在緩衝池上,確保未分配到虛擬記憶體,並確保以最高效方式利用它們。
將資料庫移至另一系統前,始終應重新評估調優參數與物理組織,即使平台相同也應如此。實際中 DBA 將經良好調優資料庫從 1 GB 記憶體 Windows 伺服器複製到 256 MB 記憶體筆電。伺服器連接花費 <1 秒,筆電卻要 45 分鐘。減少緩衝池大小與其他記憶體參數可解決。平台不同時問題更難。即使 UNIX 與 Windows 間移動,一系統最佳在另一系統未必。若為生產複製應重複調優過程。若必須移至 zSeries,此處討論某些內容不適用,應參考相關手冊紅皮書。iSeries 系統上物理設定與調優在資料庫環境外一起完成,應參考 iSeries 系統管理手冊。
本文介紹許多內容,但您應了解的資料庫設計與效能知識不限於此。重點討論兩個較大議題,未深入查詢優化與應用程式考量細節。設計資料庫是第一位的,因為是其他一切前提,初始規劃應非常全面。為方便學習,下面提供其他線上參考資料,以便繼續學習相關主題。