數(shù)據(jù)庫中的所有數(shù)據(jù)都存儲(chǔ)在許多表空間中。可以認(rèn)為表空間是孩子而數(shù)據(jù)庫是其父母,其中表空間(孩子)不能有多個(gè)數(shù)據(jù)庫(父母)。由于表空間有不同用途,因此根據(jù)它們的用途和管理方式將它們分類。根據(jù)用途有五種不同的表空間:
可以用兩種不同的方式管理表空間:
但是,不能從 SMS 表空間刪除容器,并且僅限于將新的容器添加到分區(qū)的數(shù)據(jù)庫。前一節(jié)中所說明的那三個(gè)缺省表空間都是 SMS。
清單 1 展示如何增大容器大?。?/p>
清單 1. 增加容器大小
ALTER TABLESPACE TS1 RESIZE (FILE '/conts/cont0' 2000, DEVICE '/dev/rcont1' 2000, FILE 'cont2' 2000) |
也可以使用 EXTEND 或 REDUCE 等選項(xiàng)增加或減少容器的大小。
當(dāng)您創(chuàng)建數(shù)據(jù)庫時(shí),將創(chuàng)建三個(gè)表空間(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。清單 2 展示如何使用 DB2 命令窗口或 UNIX 命令行創(chuàng)建一個(gè)名為 testdb 的數(shù)據(jù)庫,連接至該數(shù)據(jù)庫,然后列出表空間。
CREATE DATABASE testdb CONNECT TO testdb LIST TABLESPACES |
清單 3 顯示 LIST TABLESPACES 命令的輸出。
Tablespaces for Current Database Tablespace ID = 0 Name = SYSCATSPACE Type = Database managed space Contents = All permanent data. Regular table space. 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 = Database managed space Contents = All permanent data. Large table space. State = 0x0000 Detailed explanation: Normal |
清單 3 中的 3 個(gè)表空間是通過 CREATE DATABASE 命令自動(dòng)創(chuàng)建的。用戶可以通過在該命令中包含表空間說明來覆蓋缺省的表空間創(chuàng)建,但是在創(chuàng)建數(shù)據(jù)庫時(shí)必須創(chuàng)建一個(gè)目錄表空間和至少一個(gè)常規(guī)表空間,以及至少一個(gè)系統(tǒng)臨時(shí)表空間。通過使用 CREATE DATABASE 命令或以后使用 CREATE TABLESPACE 命令,可以創(chuàng)建更多的所有類型的表空間(目錄表空間除外)。
每個(gè)表空間都有一個(gè)或多個(gè)容器。同樣,可以將容器看作是孩子,而表空間是其父母。每個(gè)容器只能屬于一個(gè)表空間,但是一個(gè)表空間可以擁有許多容器??梢詫⑷萜魈砑拥?DMS 表空間,或者從 DMS 表空間中刪除容器,還可以更改容器的大小。只能將容器添加到某個(gè)分區(qū)中分區(qū)數(shù)據(jù)庫上的 SMS 表空間,在添加之前該分區(qū)還未給表空間分配容器。添加新的容器時(shí),將啟動(dòng)一個(gè)自動(dòng)的重新均衡操作,以便將數(shù)據(jù)分布到所有容器上。重新均衡操作不會(huì)妨礙對(duì)數(shù)據(jù)庫的并發(fā)訪問。
可以在創(chuàng)建表空間時(shí)給它們指定許多設(shè)置,或者也可以稍后使用 ALTER TABLESPACE 語句時(shí)指定其設(shè)置。下面描述這些設(shè)置。
頁大小 | 行大小限制 | 列數(shù)限制 | 最大容量 (DMS 表空間) |
---|---|---|---|
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 個(gè)頁,因此選擇較大的頁大小可以增加表空間的容量。
清單 4 創(chuàng)建一個(gè)常規(guī)表空間,包括本文使用的所有設(shè)置。
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 7.5 TRANSFERRATE 0.06 |
指定 LIST TABLESPACES 命令的 SHOW DETAIL 選項(xiàng)將顯示其它信息:LIST TABLESPACES SHOW DETAIL
。
清單 5 顯示 USERSPACE1 表空間的輸出。缺省情況下,將列出創(chuàng)建數(shù)據(jù)庫時(shí)所創(chuàng)建的那三個(gè)表空間。
Tablespaces for Current Database Tablespace ID = 2 Name = USERSPACE1 Type = Database managed space Contents = All permanent data. Large table space. State = 0x0000 Detailed explanation: Normal Total pages = 8192 Useable pages = 8160 Used pages = 96 Free pages = 8064 High water mark (pages) = 96 Page size (bytes) = 4096 Extent size (pages) = 32 Prefetch size (pages) = 32 Number of containers = 1 |
要列出以上輸出中的 Tablespace ID 所使用的容器,輸入 LIST TABLESPACE CONTAINERS FOR 2
。
Tablespace Containers for Tablespace 2 Container ID = 0 Name = C:\DB2\NODE0000\SQL00004\SQLT0002.0 Type = Path |
該命令列出指定表空間的所有容器。清單 6 中的路徑指向容器的物理位置。
一個(gè)緩沖池與一個(gè)數(shù)據(jù)庫相關(guān)聯(lián),可以被多個(gè)表空間使用。當(dāng)考慮將緩沖池用于一個(gè)或多個(gè)表空間時(shí),必須保證表空間頁大小和緩沖池頁大小對(duì)于緩沖池所 “服務(wù)” 的所有表空間而言都是一樣的。一個(gè)表空間只能使用一個(gè)緩沖池。
創(chuàng)建數(shù)據(jù)庫時(shí),會(huì)創(chuàng)建一個(gè)名為 IBMDEFAULTBP 的缺省緩沖池,所有的表空間都共享該緩沖池??梢允褂?CREATE BUFFERPOOL 語句添加更多的緩沖池。緩沖池的缺省大小是 BUFFPAGE 數(shù)據(jù)庫配置參數(shù)所指定的大小,但是可以通過在 CREATE BUFFERPOOL 命令中指定 SIZE 關(guān)鍵字來覆蓋該缺省值。足夠的緩沖池大小是數(shù)據(jù)庫擁有良好性能的關(guān)鍵所在,因?yàn)樗梢詼p少磁盤 I/O 這一最耗時(shí)的操作。大型緩沖池還會(huì)對(duì)查詢優(yōu)化產(chǎn)生影響,因?yàn)楦嗟墓ぷ骺稍趦?nèi)存中完成。
作為 CREATE BUFFERPOOL 語句的一個(gè)例子,輸入:CREATE BUFFERPOOL BP3 SIZE 2000 PAGESIZE 8K
將該緩沖池分配給上面的 CREATE TABLESPACE 示例上的 USERSPACE3,并且在創(chuàng)建表空間之前創(chuàng)建該緩沖池。請(qǐng)注意,緩沖池和表空間的頁大小都是 8K,兩者是相同的。如果在創(chuàng)建緩沖池之后創(chuàng)建表空間,則可以省去 CREATE TABLESPACE 語句中的 BUFFER POOL BP3 語法。相反,可以使用 ALTER TABLESPACE 命令將緩沖池添加到現(xiàn)有的表空間:ALTER TABLESPACE USERSPACE3 BUFFERPOOL BP3
。
通過查詢 SYSCAT.BUFFERPOOLS 系統(tǒng)視圖可以列出緩沖池信息,如清單 7 所示。
SELECT * FROM SYSCAT.BUFFERPOOLS BPNAME BUFFERPOOLID DBPGNAME NPAGES PAGESIZE ESTORE NUMBLOCKPAGES BLOCKSIZE ------------ ------------ -------- ------ -------- ------ ------------- --------- IBMDEFAULTBP 1 - 1000 4096 N 0 0 1 record(s) selected. |
要找出哪個(gè)緩沖池被分配給了表空間,請(qǐng)運(yùn)行清單 8 中所示的查詢:
SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES TBSPACE BUFFERPOOLID ----------- ------------ SYSCATSPACE 1 TEMPSPACE1 1 USERSPACE1 1 3 record(s) selected. |
清單 8 中的查詢中包括 BUFFERPOOLID,通過它可以查看每個(gè)表空間與哪個(gè)緩沖池相關(guān)聯(lián)。
關(guān)于數(shù)據(jù)庫如何保存表空間的可視化圖表
我們已經(jīng)知道表空間和緩沖池是什么,以及如何創(chuàng)建它們,圖 1 顯示一個(gè)關(guān)于如何在數(shù)據(jù)庫中可視化地組織表空間和緩沖池的例子。
這個(gè)例子數(shù)據(jù)庫有 5 個(gè)表空間:一個(gè)目錄表空間、兩個(gè)常規(guī)表空間、一個(gè)長(zhǎng)表空間和一個(gè)系統(tǒng)臨時(shí)表空間。沒有創(chuàng)建用戶臨時(shí)表空間。容器則有 8 個(gè)。在這個(gè)例子中,可以這樣分配緩沖池:
一般而言,在物理設(shè)備上設(shè)計(jì)如何放置表空間和容器時(shí),目標(biāo)是使 I/O 并行性和緩沖區(qū)利用率達(dá)到最優(yōu)。要實(shí)現(xiàn)這個(gè)目標(biāo),應(yīng)當(dāng)全面了解數(shù)據(jù)庫設(shè)計(jì)和應(yīng)用程序。只有這樣才能確定類似于下面這樣的問題:將兩張表分隔到不同的設(shè)備會(huì)不會(huì)產(chǎn)生并行 I/O,或者,是否應(yīng)當(dāng)在單獨(dú)的表空間中創(chuàng)建表以便可以對(duì)它進(jìn)行完全緩沖。
設(shè)計(jì)新數(shù)據(jù)庫的物理布局應(yīng)當(dāng)從設(shè)計(jì)表空間的組織開始,步驟如下。
這是一個(gè)反復(fù)的過程,應(yīng)該通過壓力測(cè)試和基準(zhǔn)測(cè)試驗(yàn)證該設(shè)計(jì)。很顯然,實(shí)現(xiàn)最佳的設(shè)計(jì)可能需要花費(fèi)大量精力,并且僅當(dāng)數(shù)據(jù)庫性能必須可能是最佳時(shí)才能證明設(shè)計(jì)是最佳的。通常:
通常,為了降低管理和保持一個(gè)較為簡(jiǎn)單的數(shù)據(jù)庫設(shè)計(jì)的復(fù)雜性,稍微降低一點(diǎn)性能是值得的。DB2 具有一種非常成熟的資源管理邏輯,往往不用進(jìn)行精心的設(shè)計(jì)就能產(chǎn)生非常好的性能。
取決于被最頻繁訪問的方式,每個(gè)表有一組最有效的表空間設(shè)置: PAGESIZE、EXTENTSIZE 和 PREFETCHSIZE。
通常應(yīng)該將目錄表空間和系統(tǒng)臨時(shí)表空間作為 SMS 分配。沒有必要擁有多個(gè)具有相同頁大小的臨時(shí)表空間,通常只需一個(gè)具有最大頁大小的臨時(shí)表空間就夠了。
突出的問題在于是否要將用戶數(shù)據(jù)分割到多個(gè)表空間中。一個(gè)考慮因素是頁的利用率。不能將行分割到不同的頁,因此具有長(zhǎng)行的表需要有合適的頁大小。但是,一個(gè)頁上的行不能超過 255 個(gè),因此具有較短行的表不能利用整個(gè)頁。
例如,在頁大小為 32K 的表空間中放置行長(zhǎng)度為 12 字節(jié)的表,它大約只能利用每個(gè)頁的 10%(即,(255 行 * 12 字節(jié) + 91 字節(jié)的開銷) / 32k 頁大小 = ~10%)。如果表很大,這只是一個(gè)考慮因素,因此浪費(fèi)的空間就非常大。它還會(huì)使 I/O 和緩存的效率降低,因?yàn)槊總€(gè)頁的實(shí)際有用內(nèi)容很少。
如果可以將表放到具有較小頁的表空間中,或者可以充分利用較大的頁大小,那么最常用的訪問方法將確定哪一個(gè)更好。如果通常是順序訪問大量行(該表可能進(jìn)行了群集),那么比較大的頁大小會(huì)更有效。如果隨機(jī)訪問行,那么較小的頁大小讓 DB2 可以更好地利用緩沖區(qū),因?yàn)橥瑯拥拇鎯?chǔ)區(qū)域可以容納更多頁。
一旦根據(jù)頁大小對(duì)表進(jìn)行了分組,那么訪問頻率和類型將確定把數(shù)據(jù)進(jìn)一步分組到獨(dú)立的表空間中是否有意義。EXTENTSIZE 是在將數(shù)據(jù)寫入到下一個(gè)容器之前寫入到當(dāng)前容器中的數(shù)據(jù)的頁數(shù)(如果表空間中存在多個(gè)容器的話)。
PREFETCHSIZE 指定在執(zhí)行數(shù)據(jù)預(yù)取時(shí)將從表空間讀取的頁數(shù)。當(dāng)數(shù)據(jù)庫管理器確定順序 I/O 是適當(dāng)?shù)模⑶掖_定預(yù)取操作可能有助于提高性能時(shí),會(huì)使用預(yù)取操作(通常是大型表掃描)。比較好的做法是將 PREFETCHSIZE 值顯式地設(shè)置成表空間的 EXTENTSIZE 值與表空間容器數(shù)的乘積的倍數(shù)。例如,如果 EXTENTSIZE 是 32,并且表空間中有 4 個(gè)容器,那么理想的 PREFETCHSIZE 應(yīng)當(dāng)是 128、256 等等。如果一個(gè)或多個(gè)頻繁使用的表需要的這組參數(shù)的值不同于那些最適用于表空間其它表的性能的參數(shù)值,那么將這些表放入單獨(dú)的表空間可能會(huì)提高整體性能。
如果預(yù)取操作是表空間中的重要因素,那么請(qǐng)考慮留出一部分緩沖區(qū)用于基于塊的 I/O。塊大小應(yīng)當(dāng)?shù)扔?PREFETCHSIZE。
使用多個(gè)用戶表空間的最重要原因是管理緩沖區(qū)的利用率。一個(gè)表空間只能與一個(gè)緩沖池相關(guān)聯(lián),而一個(gè)緩沖池可用于多個(gè)表空間。
緩沖池調(diào)優(yōu)的目標(biāo)是幫助 DB2 盡可能好地利用可用于緩沖區(qū)的內(nèi)存。整個(gè)緩沖區(qū)大小對(duì) DB2 性能有巨大影響,這是因?yàn)榇罅康捻摽梢燥@著地減少 I/O 這一最耗時(shí)的操作。但是,如果總的緩沖區(qū)大小太大,并且沒有足夠的存儲(chǔ)器可用來分配給它們,那么將為每種頁大小分配最少的緩沖池,性能就會(huì)急劇下降。要計(jì)算最大的緩沖區(qū)大小,DB2、操作系統(tǒng)以及其它任何應(yīng)用程序都必須考慮其它所有存儲(chǔ)器的利用率。一旦確定了總的可用大小,就可以將這個(gè)區(qū)域劃分成不同的緩沖池以提高利用率。如果有一些具有不同頁大小的表空間,那么每種頁大小必須至少有一個(gè)緩沖池。
擁有多個(gè)緩沖池可以將數(shù)據(jù)保存在緩沖區(qū)中。例如,假設(shè)一個(gè)數(shù)據(jù)庫有許多頻繁使用的小型表,這些表通常全部都位于緩沖區(qū)中,因此訪問起來就非???。假設(shè)有一個(gè)針對(duì)非常大的表運(yùn)行的查詢,它使用同一個(gè)緩沖池并且需要讀取比總的緩存區(qū)大小還多的頁。當(dāng)查詢運(yùn)行時(shí),來自這些頻繁使用的小型表的頁將會(huì)丟失,這使得再次需要這些數(shù)據(jù)時(shí)就必須重新讀取它們。如果小型表擁有自己的緩沖池,那么它們就必須擁有自己的表空間,因此大型查詢就不能覆蓋它們的頁。這有可能產(chǎn)生更好的整體系統(tǒng)性能,雖然這會(huì)對(duì)大型查詢?cè)斐梢恍┬〉呢?fù)面影響。
調(diào)優(yōu)常常需要為實(shí)現(xiàn)整體性能的提高而在系統(tǒng)的不同功能之間做出權(quán)衡。區(qū)分功能的優(yōu)先級(jí)并記住總吞吐量和使用情況,同時(shí)對(duì)系統(tǒng)性能進(jìn)行調(diào)整,這是非常重要的。
對(duì)于 DB2 Version 8 及更高版本,可以在不關(guān)閉數(shù)據(jù)庫的情況下更改緩沖池大小。只要數(shù)據(jù)庫共享的內(nèi)存中有足夠的保留空間可以分配給新空間,帶有 IMMEDIATE 選項(xiàng)的 ALTER BUFFERPOOL 語句會(huì)立刻生效??梢允褂眠@個(gè)功能,根據(jù)使用過程中的周期變化(例如從白天的交互式使用轉(zhuǎn)換到夜間的批處理工作)來調(diào)優(yōu)數(shù)據(jù)庫性能。DB2 Version 9.1 及更高版本將緩沖池的大小管理完全自動(dòng)化。DB2 自調(diào)優(yōu)內(nèi)存管理器(self-tuning memory manager , STMM)控制這個(gè)自動(dòng)過程。
一旦將表分布到多個(gè)表空間中,就必須決定它們的物理存儲(chǔ)器。表空間可以存儲(chǔ)在多個(gè)容器中,并且它可以是 SMS 或 DMS。SMS 更容易管理,對(duì)于包含許多不同的小型表的表空間(例如目錄表空間),尤其是那些包含 LOB 的表的表空間而言,SMS 可能是個(gè)不錯(cuò)的選擇。
為了降低每次一頁地?cái)U(kuò)展 SMS 容器的開銷,應(yīng)當(dāng)運(yùn)行 db2empfa
命令。這會(huì)將數(shù)據(jù)庫配置參數(shù) MULTIPAGE_ALLOC 的值設(shè)置成 YES
。
DMS 通常有更好的性能,并且它提供了分別地存儲(chǔ)索引和 LOB 數(shù)據(jù)的靈活性。通常應(yīng)當(dāng)將一個(gè)表空間的多個(gè)容器分開存放在單獨(dú)的物理卷上。這可以提高某些 I/O 的并行性。當(dāng)有多個(gè)用戶表空間和多個(gè)設(shè)備時(shí),應(yīng)當(dāng)考慮應(yīng)用程序邏輯,以盡可能平均地在這些設(shè)備上分配工作負(fù)載。
RAID 設(shè)備有它們自己的特殊考慮。EXTENTSIZE 應(yīng)該等于 RAID 條帶大小或者是它的倍數(shù)。PREFETCHSIZE 應(yīng)該等于 RAID 條帶大小乘以 RAID 并行設(shè)備數(shù)(或者等于該乘積的倍數(shù)),這個(gè)值應(yīng)該是 EXTENTSIZE 的倍數(shù)。DB2 提供了自己的注冊(cè)表變量,通過它們可以增強(qiáng)特定的環(huán)境。輸入以下命令,在一個(gè)容器中啟用 I/O 并行性: db2set DB2_PARALLEL_IO=*
。
至于性能評(píng)估的其它方面,要知道某個(gè)更改是否有益,唯一穩(wěn)妥的方法就是進(jìn)行基準(zhǔn)測(cè)試。如果物理組織發(fā)生了更改,那么執(zhí)行該任務(wù)稍微有些復(fù)雜,這是因?yàn)檫@時(shí)要更改表空間必須要付出相當(dāng)大的精力。最實(shí)用的方法就是減少設(shè)計(jì)階段中的案例數(shù),這樣的話稍后需要進(jìn)行基準(zhǔn)測(cè)試的案例就比較少了。只有在性能極其重要并且不同的設(shè)計(jì)之間有可能存在顯著的性能差別時(shí),才值得花時(shí)間和精力進(jìn)行嚴(yán)格的基準(zhǔn)測(cè)試來比較設(shè)計(jì)。應(yīng)當(dāng)把重點(diǎn)放在緩沖池上,確保沒有將它們分配到虛擬內(nèi)存中,并確保以最有效的方式利用它們。
聯(lián)系客服