對於剛涉足 DB2 領域的 DBA 或將來的 DBA 而言,新數據庫的設計和性能選擇可能會很使人困惑。在本文中,咱們將討論 DBA 要作出重要選擇的兩個方面:表空間和緩衝池。表空間和緩衝池的設計和調優會對 DB2 服務器的性能產生深遠的影響,所以咱們將着重討論這些活動。緩存
在咱們的示例中,咱們將使用 DB2 V8.1 企業服務器版。大多數示例也適用於低級版本。咱們會讓您知道某個示例是否只適用於 V8.1。服務器
在 第 1 節中,咱們將從定義表空間的類型開始,並將說明 DB2 如何將數據存儲在表空間中。咱們將介紹配置選項並向您介紹建立和管理表空間的整個過程。接下來,咱們將着重討論 緩衝池,介紹緩衝池是什麼以及如何建立和使用它。在 第 2 節中,咱們將結合這兩個方面並討論該如何組織緩衝池和表空間才能得到最佳性能。併發
回頁首app
數據庫中的全部數據都存儲在許多表空間中。能夠認爲表空間是孩子而數據庫是其父母,其中表空間(孩子)不能有多個數據庫(父母)。因爲表空間有不一樣用途,所以根據它們的用途和管理方式將它們分類。根據用途有五種不一樣的表空間:性能
能夠用兩種不一樣的方式管理表空間:fetch
下面是一個示例,向您說明該如何增大容器大小(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 命令行,建立一個名爲 testdb 的數據庫,鏈接至該數據庫,而後列出表空間:
CREATE DATABASE testdb CONNECT TO testdb LIST TABLESPACES |
下面的 清單 1顯示了 LIST TABLESPACES 命令的輸出。
Tablespaces for Current Database Tablespace ID = 0 Name = SYSCATSPACE Type = System managed space Contents = Any data State = 0x0000 Detailed explanation: Normal Tablespace ID = 1 Name = TEMPSPACE1 Type = System managed space Contents = System Temporary data State = 0x0000 Detailed explanation: Normal Tablespace ID = 2 Name = USERSPACE1 Type = System managed space Contents = Any data State = 0x0000 Detailed explanation: Normal |
上面所示的這三個表空間是經過 CREATE DATABASE 命令自動建立的。用戶能夠經過在該命令中包含表空間說明來覆蓋缺省的表空間建立,可是在建立數據庫時必須建立一個目錄表空間和至少一個常規表空間,以及至少一個系統臨時表空間。經過使用 CREATE DATABASE 命令或之後使用 CREATE TABLESPACE 命令,能夠建立更多的全部類型的表空間(目錄表空間除外)。
每一個表空間都有一個或多個容器。重申一次,您能夠認爲容器是孩子,而表空間是其父母。每一個容器只能屬於一個表空間,可是一個表空間能夠擁有許多容器。能夠將容器添加到 DMS 表空間,或者從 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 |
表空間最多可包含 16384 個頁,所以選擇較大的頁大小能夠增長表空間的容量。
下列語句將建立一個常規表空間。所討論的全部設置都是爲了進行說明。
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 選項將顯示其它信息:
LIST TABLESPACES SHOW DETAIL |
清單 2顯示了 USERSPACE1 表空間的輸出。缺省狀況下,將列出建立數據庫時所建立的那三個表空間。
清單 2. LlST TABLESPACES SHOW DETAIL 命令的輸出
Tablespaces for Current Database Tablespace ID = 2 Name = USERSPACE1 Type = System managed space Contents = Any data State = 0x0000 Detailed explanation: Normal Total pages = 336 Useable pages = 336 Used pages = 336 Free pages = Not applicable High water mark (pages) = Not applicable Page size (bytes) = 4096 Extent size (pages) = 32 Prefetch size (pages) = 16 Number of containers = 1 |
要列出容器,咱們須要使用以上輸出中的 Tablespace ID:
LIST TABLESPACE CONTAINERS FOR 2 |
清單 3. LIST TABLESPACE CONTAINERS 命令的輸出
Tablespace Containers for Tablespace 2 Container ID = 0 Name = C:\\DB2\\NODE0000\\SQL00004\\SQLT0002.0 Type = Path |
該命令將列出指定表空間中的全部容器。如上所示的路徑指向容器物理上所在的位置。
一個緩衝池是與單個數據庫相關聯的,能夠被多個表空間使用。當考慮將緩衝池用於一個或多個表空間時,必須保證表空間頁大小和緩衝池頁大小對於緩衝池所「服務」的全部表空間而言都是同樣的。一個表空間只能使用一個緩衝池。
建立數據庫時,會建立一個名爲 IBMDEFAULTBP 的缺省緩衝池,全部的表空間都共享該緩衝池。可使用 CREATE BUFFERPOOL 語句添加更多的緩衝池。緩衝池的缺省大小是 BUFFPAGE 數據庫配置參數所指定的大小,可是能夠經過在 CREATE BUFFERPOOL 命令中指定 SIZE 關鍵字來覆蓋該缺省值。足夠的緩衝池大小是數據庫擁有良好性能的關鍵所在,由於它能夠減小磁盤 I/O 這一最耗時的操做。大型緩衝池還會對查詢優化產生影響,由於更多的工做可在內存中完成。
基於塊的緩衝池
V8 容許您留出緩衝池的一部分(最高可達 98%)用於基於塊的預取操做。基於塊的 I/O 能夠經過將塊讀入相鄰的內存區而不是將它分散裝入單獨的頁,來提升預取操做的效率。每一個緩衝池的塊大小必須相同,而且由 BLOCKSIZE 參數進行控制。該值等於塊的大小(單位爲頁),從 2 到 256,缺省值爲 32。
擴展存儲器
DB2 不將擴展存儲器用於緩衝區。可是,能夠用擴展存儲器來高速緩存內存頁,使得從內存移出頁變得更快。
下面是 CREATE BUFFERPOOL 語句的一個示例:
CREATE BUFFERPOOL BP3 SIZE 2000 PAGESIZE 8K |
該緩衝池被分配給上面的 CREATE TABLESPACE 示例上的 USERSPACE3,而且在建立表空間以前建立該緩衝池。請注意,緩衝池和表空間的頁大小都是 8K,二者是相同的。若是您在建立緩衝池以後建立表空間,則能夠省去 CREATE TABLESPACE 語句中的 BUFFER POOL BP3 語法。相反,可使用 altER TABLESPACE 命令將緩衝池添加到現有的表空間:
ALTER TABLESPACE USERSPACE3 BUFFERPOOL BP3 |
經過查詢 SYSCAT.BUFFERPOOLS 系統視圖能夠列出緩衝池信息:
SELECT * FROM SYSCAT.BUFFERPOOLS BPNAME BUFFERPOOLID NGNAME NPAGES PAGESIZE ES ------------------ ------------ ------------------ ----------- ----------- -- IBMDEFAULTBP 1 - 250 4096 N 1 record(s) selected. |
要找出哪一個緩衝池被分配給了表空間,請運行下面這個查詢:
SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES TBSPACE BUFFERPOOLID ------------------ ------------ SYSCATSPACE 1 TEMPSPACE1 1 USERSPACE1 1 3 record(s) selected. |
能夠在上一個查詢中找到 BUFFERPOOLID,該查詢使您可以看到每一個表空間與哪一個緩衝池相關聯。
既然咱們已經描述了表空間和緩衝池是什麼以及如何建立它們,那麼就讓咱們研究一下有關如何在數據庫中將它們直觀地組織起來的示例。
該數據庫有 5 個表空間:一個目錄表空間、兩個常規表空間、一個長表空間和一個系統臨時表空間。沒有建立用戶臨時表空間。另外有 8 個容器。
在這個方案中,緩衝池可能以下分配:
將 BP1(4K)分配給 SYSCATSPACE 和 USERSPACE2
將 BP2(8K)分配給 USERSPACE1
將 BP3(32K)分配給 LARGESPACE 和 SYSTEMP1
回頁首
通常而言,在物理設備上設計如何放置表空間和容器時,目標是使 I/O 並行性和緩衝區利用率達到最優。要實現這個目標,應當全面瞭解數據庫設計和應用程序。只有這樣您才能肯定相似於下面這樣的問題:將兩張表分隔到不一樣的設備會不會產生並行 I/O,或者,是否應當在單獨的表空間中建立表以即可以對它進行徹底緩衝。
設計新數據庫的物理佈局應當從設計表空間的組織開始:
這個是一個有反覆的過程,應該經過壓力測試和基準測試驗證該設計。很顯然,實現最佳的設計可能須要花費大量精力,而且僅當數據庫性能必須多是最佳時才能證實設計是最佳的。一般:
一般,爲了下降管理和保持一個較爲簡單的數據庫設計的複雜性,稍微下降一點性能是值得的。DB2 具備一種很是成熟的資源管理邏輯,每每不用進行精心的設計就能產生很是好的性能。
一般應該將目錄表空間和系統臨時表空間做爲 SMS 分配。沒有必要擁有多個具備相同頁大小的臨時表空間,一般只需一個具備最大頁大小的臨時表空間就夠了。
突出的問題在因而否要將用戶數據分割到多個表空間中。一個考慮因素是頁的利用率。不能將行分割到不一樣的頁,所以具備長行的表須要有合適的頁大小。可是,一個頁上的行不能超過 255 個,所以具備較短行的表不能利用整個頁。例如,在頁大小爲 32K 的表空間中放置行長度爲 12 字節的表,它大約只能利用每一個頁的 10%(即,(255 行 * 12 字節 + 91 字節的開銷) / 32k 頁大小 = ~10%)。
若是表很大,這只是一個考慮因素,所以浪費的空間就很是大。它還會使 I/O 和緩存的效率下降,由於每一個頁的實際有用內容不多。若是能夠將表放到具備較小頁的表空間中,以及能夠充分利用較大的頁大小,那麼最經常使用的訪問方法將肯定哪個更好。若是一般是順序訪問大量行(該表可能進行了羣集),那麼比較大的頁大小會比較有效。若是隨機訪問行,那麼較小的頁大小能夠容許 DB2 更好地利用緩衝區,由於一樣的存儲區域能夠容納更多頁。
一旦根據頁大小對錶進行了分組,那麼訪問頻率和類型將肯定把數據進一步分組到獨立的表空間中是否有意義。每張表根據本身被最頻繁訪問的方式,能夠具備一組最有效的表空間設置:PAGESIZE、EXTENTSIZE 和 PREFETCHSIZE。上面已介紹了 PAGESIZE。EXTENTSIZE 是在將數據寫入到下一個容器以前寫入到當前容器中的數據的頁數(若是表空間中存在多個容器的話)。
PREFETCHSIZE 指定在執行數據預取時將從表空間讀取的頁數。當數據庫管理器肯定順序 I/O 是適當的,而且肯定預取操做可能有助於提升性能時,會使用預取操做(一般是大型表掃描)。比較好的作法是將 PREFETCHSIZE 值顯式地設置成表空間的 EXTENTSIZE 值與表空間容器數的乘積的倍數。例如,若是 EXTENTSIZE 是 32,而且表空間中有 4 個容器,那麼理想的 PREFETCHSIZE 應當是 12八、256 等等。若是一個或多個頻繁使用的表須要的這組參數的值不一樣於那些最適用於表空間其它表的性能的參數值,那麼將這些表放入單獨的表空間可能會提升總體性能。
若是預取操做是表空間中的重要因素,那麼請考慮留出一部分緩衝區用於基於塊的 I/O。塊大小應當等於 PREFETCHSIZE。
使用多個用戶表空間的最重要緣由是管理緩衝區的利用率。一個表空間只能與一個緩衝池相關聯,而一個緩衝池可用於多個表空間。
緩衝池調優的目標是幫助 DB2 儘量好地利用可用於緩衝區的內存。整個緩衝區大小對 DB2 性能有巨大影響,這是由於大量的頁能夠顯著地減小 I/O 這一最耗時的操做。可是,若是總的緩衝區大小太大,而且沒有足夠的存儲器可用來分配給它們,那麼將爲每種頁大小分配最少的緩衝池,性能就會急劇降低。要計算最大的緩衝區大小,DB二、操做系統以及其它任何應用程序都必須考慮其它全部存儲器的利用率。一旦肯定了總的可用大小,就能夠將這個區域劃分紅不一樣的緩衝池以提升利用率。若是有一些具備不一樣頁大小的表空間,那麼每種頁大小必須至少有一個緩衝池。
擁有多個緩衝池能夠將數據保存在緩衝區中。例如,讓咱們假設一個數據庫有許多頻繁使用的小型表,這些表一般所有都位於緩衝區中,所以訪問起來就很是快。如今讓咱們假設有一個針對很是大的表運行的查詢,它使用同一個緩衝池而且須要讀取比總的緩存區大小還多的頁。當查詢運行時,來自這些頻繁使用的小型表的頁將會丟失,這使得再次須要這些數據時就必須從新讀取它們。
若是小型表擁有本身的緩衝池,那麼它們就必須擁有本身的表空間,所以大型查詢就不能覆蓋它們的頁。這有可能產生更好的總體系統性能,雖然這會對大型查詢形成一些小的負面影響。常常性地進行調優是爲了實現總體的性能提升而在不一樣的系統功能之間作出的權衡。區分功能的優先級並記住總吞吐量和使用狀況,同時對系統性能進行調整,這是很是重要的。
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 提供了本身的註冊表變量,容許您加強您的特定環境。經過執行下面這個命令,能夠在一個容器中啓用 I/O 並行性:
db2set DB2_PARALLEL_IO=* |
另外一個註冊表變量 DB2_STRIPED_CONTAINERS=ON 能夠將容器標記大小從一個頁更改爲整個擴展塊,所以就能使表空間擴展塊和 RAID 條帶一致。
至於性能評估的其它方面,要知道某個更改是否有益,惟一穩妥的方法就是進行基準測試。若是物理組織發生了更改,那麼執行該任務稍微有些複雜,這是由於這時要更改表空間必需要付出至關大的精力。最實用的方法就是減小設計階段中的案例數,這樣的話稍後須要進行基準測試的案例就比較少了。只有在性能極其重要而且不一樣的設計之間有可能存在顯著的性能差異時,才值得花時間和精力進行嚴格的基準測試來比較設計。應當把重點放在緩衝池上,確保沒有將它們分配到虛擬內存中,並確保以最有效的方式利用它們。
在將數據庫移到另外一個系統以前,始終應該從新評估它的調優參數和物理組織,即使這些系統是同一種平臺也應如此。在實際狀況中,DBA 將通過良好調優的數據庫從具備 1 GB 內存的 Windows 服務器複製到具備 256 MB 內存的膝上型計算機中。在服務器上進行鏈接所花的時間小於一秒,而在膝上型計算機中卻要用掉 45 分鐘。經過減小緩衝池大小和其它內存參數就能解決這個問題。
若是平臺不同,那麼這個問題就變得更難了。即便是在 UNIX 和 Windows 之間進行移動,在一個系統上已經是最佳性能,在另外一個系統上卻未必如此。若是複製數據庫是爲了進行生產,那麼應當重複調優過程。若是必須將數據庫移到 zSeries™,那麼這裏討論的某些內容則不適用,而應該參考有關的手冊和紅皮書。在 iSeries 系統上,物理設置和調優是在數據庫環境以外一塊兒完成的,應當參考 iSeries™ 系統管理手冊。