程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2基礎:表空間和緩沖池

DB2基礎:表空間和緩沖池

編輯:DB2教程

本文專為 IBM DB2 Universal Database™ for Linux、UNIX® 和 Windows® 而撰寫

簡介

對於剛涉足 DB2 領域的 DBA 或未來的 DBA 而言,新數據庫的設計和性能選擇可能會很令人困惑。在本文中,我們將討論 DBA 要做出重要選擇的兩個方面:表空間和緩沖池。表空間和緩沖池的設計和調優會對 DB2 服務器的性能產生深遠的影響,因此我們將著重討論這些活動。

在我們的示例中,我們將使用 DB2 V8.1 企業服務器版。大多數示例也適用於低級版本。我們會讓您知道某個示例是否只適用於 V8.1。

在 第 1 節中,我們將從定義表空間的類型開始,並將說明 DB2 如何將數據存儲在表空間中。我們將介紹配置選項並向您介紹創建和管理表空間的整個過程。接下來,我們將著重討論 緩沖池,介紹緩沖池是什麼以及如何創建和使用它。在 第 2 節中,我們將結合這兩個方面並討論該如何組織緩沖池和表空間才能獲得最佳性能。

第 1 節:定義

表空間

數據庫中的所有數據都存儲在許多表空間中。可以認為表空間是孩子而數據庫是其父母,其中表空間(孩子)不能有多個數據庫(父母)。由於表空間有不同用途,因此根據它們的用途和管理方式將它們分類。根據用途有五種不同的表空間:

目錄表空間 每個數據庫只有一個目錄表空間,它是在發出 CREATE DATABASE 命令時創建的。目錄表空間被 DB2 命名為 SYSCATSPACE,它保存了系統目錄表。總是在創建數據庫時創建該表空間。 常規表空間 常規表空間保存表數據和索引。它還可以保存諸如大對象(Large Object,LOB)之類的長數據,除非這些數據顯式地存儲在長表空間中。如果某些表空間是數據庫管理的空間(Database Managed Space,DMS),則可以將表及其索引分別放到單獨的常規表空間中。我們將在本文後面定義 DMS 和系統管理的空間(System Managed Space,SMS)之間的區別。每個數據庫中必須至少有一個常規表空間。創建數據庫時指定該表空間的缺省名為 USERSPACE1。 長表空間 長表空間用於存儲長型或 LOB 表列,它們必須駐留在 DMS 表空間中。它們還可以存儲結構化類型的列或索引數據。如果沒有定義長表空間,那麼將把 LOB 存儲在常規表空間中。長表空間是可選的,缺省情況下一個都不創建。 系統臨時表空間 系統臨時表空間用於存儲 SQL 操作(比如排序、重組表、創建索引和連接表)期間所需的內部臨時數據。每個數據庫必須至少有一個系統臨時表空間。隨數據庫創建的系統臨時表空間的缺省名為 TEMPSPACE1。 用戶臨時表空間 用戶臨時表空間存儲已聲明的全局臨時表。創建數據庫時不存在用戶臨時表空間。至少應當創建一個用戶臨時表空間以允許定義已聲明的臨時表。用戶臨時表空間是可選的,缺省情況下一個都不創建。

表空間管理

可以用兩種不同的方式管理表空間:

系統管理的空間(SMS) SMS 表空間由操作系統進行管理。容器被定義成常規操作系統文件,並且是通過操作系統調用訪問的。這意味著所有的常規操作系統功能將處理以下內容:操作系統將緩沖 I/O;根據操作系統約定分配空間;如有必要就自動擴展表空間。但是,不能從 SMS 表空間刪除容器,並且僅限於將新的容器添加到分區的數據庫。前一節中所說明的那三個缺省表空間都是 SMS。 數據庫管理的空間(DMS) DMS 表空間是由 DB2 管理的。可以將容器定義成文件(在創建表空間時將把給定的大小全部分配給它們)或設備。分配方法和操作系統允許多少 I/O,DB2 就可以管理多少 I/O。可以通過使用 altER TABLESPACE 命令來擴展容器。還可以釋放未使用的那部分 DMS 容器(從 V8 開始)。

下面是一個示例,向您說明該如何增大容器大小(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 命令的輸出。

清單 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 語句時指定其設置。

頁大小(Page size) 定義表空間所使用的頁大小。所支持的大小為 4K、8K、16K 和 32K。頁大小根據下表限定了可放到表空間中的表的行長度和列數:

表 1. 頁大小的含義 頁大小 行大小限制 列數限制 最大容量 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 個頁,因此選擇較大的頁大小可以增加表空間的容量。

擴展塊大小(Extent size) 指定在跳到下一個容器之前將寫到當前容器中的頁數。存儲數據時數據庫管理器反復循環使用所有容器。該參數只有在表空間中有多個容器時才起作用。 預取大小(Prefetch size) 指定當執行數據預取時將從表空間讀取的頁數。預取操作在查詢引用所需的數據之前讀入這些數據,這樣一來查詢就不必等待執行 I/O 了。當數據庫管理器確定順序 I/O 是適當的,並且確定預取操作可能有助於提高性能時,它就選擇預取操作。 開銷(Overhead)和傳送速率(Transfer rate) 這些值用於確定查詢優化期間的 I/O 成本。這兩個值的測量單位都是毫秒,而且它們應當分別是所有容器開銷和傳送速率的平均值。開銷是與 I/O 控制器活動、磁盤尋道時間和旋轉延遲時間相關聯的時間。傳送速率是將一個頁讀入內存所必需的時間量。它們的缺省值分別是 24.1 和 0.9。可以根據硬件規格計算這些值。

CREATE TABLESPACE 語句的示例

下列語句將創建一個常規表空間。所討論的所有設置都是為了進行說明。

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:DB2NODE0000SQL00004SQLT0002.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 語句的一個示例:

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,該查詢使您能夠看到每個表空間與哪個緩沖池相關聯。

數據庫如何保存表空間的可視化圖表

既然我們已經描述了表空間和緩沖池是什麼以及如何創建它們,那麼就讓我們研究一下有關如何在數據庫中將它們直觀地組織起來的示例。

圖 1. 表空間和緩沖池

表空間組織

通常應該將目錄表空間和系統臨時表空間作為 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 應當是 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 提供了自己的注冊表變量,允許您增強您的特定環境。通過執行下面這個命令,可以在一個容器中啟用 I/O 並行性:

db2set DB2_PARALLEL_IO=*

另一個注冊表變量 DB2_STRIPED_CONTAINERS=ON 可以將容器標記大小從一個頁更改成整個擴展塊,因此就能使表空間擴展塊和 RAID 條帶一致。

至於性能評估的其它方面,要知道某個更改是否有益,唯一穩妥的方法就是進行基准測試。如果物理組織發生了更改,那麼執行該任務稍微有些復雜,這是因為這時要更改表空間必須要付出相當大的精力。最實用的方法就是減少設計階段中的案例數,這樣的話稍後需要進行基准測試的案例就比較少了。只有在性能極其重要並且不同的設計之間有可能存在顯著的性能差別時,才值得花時間和精力進行嚴格的基准測試來比較設計。應當把重點放在緩沖池上,確保沒有將它們分配到虛擬內存中,並確保以最有效的方式利用它們。

有關移動數據庫的考慮事項

在將數據庫移到另一個系統之前,始終應該重新評估它的調優參數和物理組織,即便這些系統是同一種平台也應如此。在實際情況中,DBA 將經過良好調優的數據庫從具有 1 GB 內存的 Windows 服務器復制到具有 256 MB 內存的膝上型計算機中。在服務器上進行連接所花的時間小於一秒,而在膝上型計算機中卻要用掉 45 分鐘。通過減少緩沖池大小和其它內存參數就能解決這個問題。

如果平台不一樣,那麼這個問題就變得更難了。即使是在 UNIX 和 Windows 之間進行移動,在一個系統上已是最佳性能,在另一個系統上卻未必如此。如果復制數據庫是為了進行生產,那麼應當重復調優過程。如果必須將數據庫移到 zSeries™,那麼這裡討論的某些內容則不適用,而應該參考有關的手冊和紅皮書。在 iSerIEs 系統上,物理設置和調優是在數據庫環境之外一起完成的,應當參考 iSerIEs™ 系統管理手冊。

結束語

我們在本文中介紹了許多內容,但是您應當了解的有關數據庫設計和性能的知識決不僅限於此。我們著重討論了數據庫設計的兩個比較大的問題,而沒有深入研究查詢優化和應用程序考慮事項的細節。設計數據庫是第一位的,因為這是其它所有事情的前提,因此您的初始規劃應該非常全面。為了方便您的學習,我們在下面提供了其它聯機參考資料,這樣您就可以繼續學習有關本主題的內容。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved