【DB2】DB2基礎(chǔ)_表空間和緩沖池

簡(jiǎn)介

對(duì)于剛涉足 DB2 領(lǐng)域的 DBA 或未來的 DBA 而言,新數(shù)據(jù)庫(kù)的設(shè)計(jì)和性能選擇可能會(huì)很令人困惑。在本文中,我們將討論 DBA 要做出重要選擇的兩個(gè)方面:表空間和緩沖池。表空間和緩沖池的設(shè)計(jì)和調(diào)優(yōu)會(huì)對(duì) DB2 服務(wù)器的性能產(chǎn)生深遠(yuǎn)的影響,因此我們將著重討論這些活動(dòng)。

在我們的示例中,我們將使用 DB2 V8.1 企業(yè)服務(wù)器版。大多數(shù)示例也適用于低級(jí)版本。我們會(huì)讓您知道某個(gè)示例是否只適用于 V8.1。

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

第 1 節(jié):定義

表空間

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

  • 目錄表空間

    每個(gè)數(shù)據(jù)庫(kù)只有一個(gè)目錄表空間,它是在發(fā)出 CREATE DATABASE 命令時(shí)創(chuàng)建的。目錄表空間被 DB2 命名為 SYSCATSPACE,它保存了系統(tǒng)目錄表。總是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)創(chuàng)建該表空間。

  • 常規(guī)表空間

    常規(guī)表空間保存表數(shù)據(jù)和索引。它還可以保存諸如大對(duì)象(Large Object,LOB)之類的長(zhǎng)數(shù)據(jù),除非這些數(shù)據(jù)顯式地存儲(chǔ)在長(zhǎng)表空間中。如果某些表空間是數(shù)據(jù)庫(kù)管理的空間(Database Managed Space,DMS),則可以將表及其索引分別放到單獨(dú)的常規(guī)表空間中。我們將在本文后面定義 DMS 和系統(tǒng)管理的空間(System Managed Space,SMS)之間的區(qū)別。每個(gè)數(shù)據(jù)庫(kù)中必須至少有一個(gè)常規(guī)表空間。創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定該表空間的缺省名為 USERSPACE1。

  • 長(zhǎng)表空間

    長(zhǎng)表空間用于存儲(chǔ)長(zhǎng)型或 LOB 表列,它們必須駐留在 DMS 表空間中。它們還可以存儲(chǔ)結(jié)構(gòu)化類型的列或索引數(shù)據(jù)。如果沒有定義長(zhǎng)表空間,那么將把 LOB 存儲(chǔ)在常規(guī)表空間中。長(zhǎng)表空間是可選的,缺省情況下一個(gè)都不創(chuàng)建。

  • 系統(tǒng)臨時(shí)表空間

    系統(tǒng)臨時(shí)表空間用于存儲(chǔ) SQL 操作(比如排序、重組表、創(chuàng)建索引和連接表)期間所需的內(nèi)部臨時(shí)數(shù)據(jù)。每個(gè)數(shù)據(jù)庫(kù)必須至少有一個(gè)系統(tǒng)臨時(shí)表空間。隨數(shù)據(jù)庫(kù)創(chuàng)建的系統(tǒng)臨時(shí)表空間的缺省名為 TEMPSPACE1。

  • 用戶臨時(shí)表空間

    用戶臨時(shí)表空間存儲(chǔ)已聲明的全局臨時(shí)表。創(chuàng)建數(shù)據(jù)庫(kù)時(shí)不存在用戶臨時(shí)表空間。至少應(yīng)當(dāng)創(chuàng)建一個(gè)用戶臨時(shí)表空間以允許定義已聲明的臨時(shí)表。用戶臨時(shí)表空間是可選的,缺省情況下一個(gè)都不創(chuàng)建。

表空間管理

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

  • 系統(tǒng)管理的空間(SMS)

    SMS 表空間由操作系統(tǒng)進(jìn)行管理。容器被定義成常規(guī)操作系統(tǒng)文件,并且是通過操作系統(tǒng)調(diào)用訪問的。這意味著所有的常規(guī)操作系統(tǒng)功能將處理以下內(nèi)容:操作系統(tǒng)將緩沖 I/O;根據(jù)操作系統(tǒng)約定分配空間;如有必要就自動(dòng)擴(kuò)展表空間。但是,不能從 SMS 表空間刪除容器,并且僅限于將新的容器添加到分區(qū)的數(shù)據(jù)庫(kù)。前一節(jié)中所說明的那三個(gè)缺省表空間都是 SMS。

  • 數(shù)據(jù)庫(kù)管理的空間(DMS)

    DMS 表空間是由 DB2 管理的。可以將容器定義成文件(在創(chuàng)建表空間時(shí)將把給定的大小全部分配給它們)或設(shè)備。分配方法和操作系統(tǒng)允許多少 I/O,DB2 就可以管理多少 I/O。可以通過使用 altER TABLESPACE 命令來擴(kuò)展容器。還可以釋放未使用的那部分 DMS 容器(從 V8 開始)。

下面是一個(gè)示例,向您說明該如何增大容器大小(V7 和 V8 都支持此功能):

ALTER TABLESPACE TS1 RESIZE (FILE '/conts/cont0' 2000, DEVICE '/dev/rcont1' 2000, FILE 'cont2' 2000)

請(qǐng)注意,只有 V8 才支持將原始容器的大小調(diào)整得更小。

如何創(chuàng)建和查看表空間

當(dāng)您創(chuàng)建數(shù)據(jù)庫(kù)時(shí),將創(chuàng)建三個(gè)表空間(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。通過使用 DB2 命令窗口(Command Window)或 UNIX 命令行,創(chuàng)建一個(gè)名為 testdb 的數(shù)據(jù)庫(kù),連接至該數(shù)據(jù)庫(kù),然后列出表空間:

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

上面所示的這三個(gè)表空間是通過 CREATE DATABASE 命令自動(dòng)創(chuàng)建的。用戶可以通過在該命令中包含表空間說明來覆蓋缺省的表空間創(chuàng)建,但是在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)必須創(chuàng)建一個(gè)目錄表空間和至少一個(gè)常規(guī)表空間,以及至少一個(gè)系統(tǒng)臨時(shí)表空間。通過使用 CREATE DATABASE 命令或以后使用 CREATE TABLESPACE 命令,可以創(chuàng)建更多的所有類型的表空間(目錄表空間除外)。

容器

每個(gè)表空間都有一個(gè)或多個(gè)容器。重申一次,您可以認(rèn)為容器是孩子,而表空間是其父母。每個(gè)容器只能屬于一個(gè)表空間,但是一個(gè)表空間可以擁有許多容器。可以將容器添加到 DMS 表空間,或者從 DMS 表空間中刪除容器,而且可以更改容器的大小。只能將容器添加到某個(gè)分區(qū)中分區(qū)數(shù)據(jù)庫(kù)上的 SMS 表空間,在添加之前該分區(qū)還未給表空間分配容器。添加新的容器時(shí),將啟動(dòng)一個(gè)自動(dòng)的重新均衡操作以便將數(shù)據(jù)分布到所有容器上。重新均衡操作不會(huì)妨礙對(duì)數(shù)據(jù)庫(kù)的并發(fā)訪問。

表空間設(shè)置

可以在創(chuàng)建表空間時(shí)給它們指定許多設(shè)置,或者也可以稍后使用 altER TABLESPACE 語句時(shí)指定其設(shè)置。

  • 頁大小(Page size)

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

    表 1. 頁大小的含義

    頁大小 行大小 限制列數(shù) 限制最大容量
    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è)頁,因此選擇較大的頁大小可以增加表空間的容量。

  • 擴(kuò)展塊大小(Extent size)

    指定在跳到下一個(gè)容器之前將寫到當(dāng)前容器中的頁數(shù)。存儲(chǔ)數(shù)據(jù)時(shí)數(shù)據(jù)庫(kù)管理器反復(fù)循環(huán)使用所有容器。該參數(shù)只有在表空間中有多個(gè)容器時(shí)才起作用。

  • 預(yù)取大小(Prefetch size)

    指定當(dāng)執(zhí)行數(shù)據(jù)預(yù)取時(shí)將從表空間讀取的頁數(shù)。預(yù)取操作在查詢引用所需的數(shù)據(jù)之前讀入這些數(shù)據(jù),這樣一來查詢就不必等待執(zhí)行 I/O 了。當(dāng)數(shù)據(jù)庫(kù)管理器確定順序 I/O 是適當(dāng)?shù)模⑶掖_定預(yù)取操作可能有助于提高性能時(shí),它就選擇預(yù)取操作。

  • 開銷(Overhead)和傳送速率(Transfer rate)

    這些值用于確定查詢優(yōu)化期間的 I/O 成本。這兩個(gè)值的測(cè)量單位都是毫秒,而且它們應(yīng)當(dāng)分別是所有容器開銷和傳送速率的平均值。開銷是與 I/O 控制器活動(dòng)、磁盤尋道時(shí)間和旋轉(zhuǎn)延遲時(shí)間相關(guān)聯(lián)的時(shí)間。傳送速率是將一個(gè)頁讀入內(nèi)存所必需的時(shí)間量。它們的缺省值分別是 24.1 和 0.9。可以根據(jù)硬件規(guī)格計(jì)算這些值。

CREATE TABLESPACE 語句的示例

下列語句將創(chuàng)建一個(gè)常規(guī)表空間。所討論的所有設(shè)置都是為了進(jìn)行說明。

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 選項(xiàng)將顯示其它信息:

LIST TABLESPACES SHOW DETAIL

清單 2顯示了 USERSPACE1 表空間的輸出。缺省情況下,將列出創(chuàng)建數(shù)據(jù)庫(kù)時(shí)所創(chuàng)建的那三個(gè)表空間。

清單 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

該命令將列出指定表空間中的所有容器。如上所示的路徑指向容器物理上所在的位置。

緩沖池

一個(gè)緩沖池是與單個(gè)數(shù)據(jù)庫(kù)相關(guān)聯(lián)的,可以被多個(gè)表空間使用。當(dāng)考慮將緩沖池用于一個(gè)或多個(gè)表空間時(shí),必須保證表空間頁大小和緩沖池頁大小對(duì)于緩沖池所“服務(wù)”的所有表空間而言都是一樣的。一個(gè)表空間只能使用一個(gè)緩沖池。

創(chuàng)建數(shù)據(jù)庫(kù)時(shí),會(huì)創(chuàng)建一個(gè)名為 IBMDEFAULTBP 的缺省緩沖池,所有的表空間都共享該緩沖池。可以使用 CREATE BUFFERPOOL 語句添加更多的緩沖池。緩沖池的缺省大小是 BUFFPAGE 數(shù)據(jù)庫(kù)配置參數(shù)所指定的大小,但是可以通過在 CREATE BUFFERPOOL 命令中指定 SIZE 關(guān)鍵字來覆蓋該缺省值。足夠的緩沖池大小是數(shù)據(jù)庫(kù)擁有良好性能的關(guān)鍵所在,因?yàn)樗梢詼p少磁盤 I/O 這一最耗時(shí)的操作。大型緩沖池還會(huì)對(duì)查詢優(yōu)化產(chǎn)生影響,因?yàn)楦嗟墓ぷ骺稍趦?nèi)存中完成。

基于塊的緩沖池
V8 允許您留出緩沖池的一部分(最高可達(dá) 98%)用于基于塊的預(yù)取操作。基于塊的 I/O 可以通過將塊讀入相鄰的內(nèi)存區(qū)而不是將它分散裝入單獨(dú)的頁,來提高預(yù)取操作的效率。每個(gè)緩沖池的塊大小必須相同,并且由 BLOCKSIZE 參數(shù)進(jìn)行控制。該值等于塊的大小(單位為頁),從 2 到 256,缺省值為 32。

擴(kuò)展存儲(chǔ)器
DB2 不將擴(kuò)展存儲(chǔ)器用于緩沖區(qū)。但是,可以用擴(kuò)展存儲(chǔ)器來高速緩存內(nèi)存頁,使得從內(nèi)存移出頁變得更快。

CREATE BUFFERPOOL 語句的示例

下面是 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)視圖可以列出緩沖池信息:

SELECT * FROM SYSCAT.BUFFERPOOLS BPNAME BUFFERPOOLID NGNAME NPAGES PAGESIZE ES ------------------ ------------ ------------------ ----------- ----------- -- IBMDEFAULTBP 1 - 250 4096 N 1 record(s) selected.

要找出哪個(gè)緩沖池被分配給了表空間,請(qǐng)運(yùn)行下面這個(gè)查詢:

SELECT TBSPACE, BUFFERPOOLID FROM SYSCAT.TABLESPACES TBSPACE BUFFERPOOLID ------------------ ------------ SYSCATSPACE 1 TEMPSPACE1 1 USERSPACE1 1 3 record(s) selected.

可以在上一個(gè)查詢中找到 BUFFERPOOLID,該查詢使您能夠看到每個(gè)表空間與哪個(gè)緩沖池相關(guān)聯(lián)。

數(shù)據(jù)庫(kù)如何保存表空間的可視化圖表

既然我們已經(jīng)描述了表空間和緩沖池是什么以及如何創(chuàng)建它們,那么就讓我們研究一下有關(guān)如何在數(shù)據(jù)庫(kù)中將它們直觀地組織起來的示例。

圖 1. 表空間和緩沖池

wieser1.gif

該數(shù)據(jù)庫(kù)有 5 個(gè)表空間:一個(gè)目錄表空間、兩個(gè)常規(guī)表空間、一個(gè)長(zhǎng)表空間和一個(gè)系統(tǒng)臨時(shí)表空間。沒有創(chuàng)建用戶臨時(shí)表空間。另外有 8 個(gè)容器。

在這個(gè)方案中,緩沖池可能如下分配:
將 BP1(4K)分配給 SYSCATSPACE 和 USERSPACE2
將 BP2(8K)分配給 USERSPACE1
將 BP3(32K)分配給 LARGESPACE 和 SYSTEMP1

第 2 節(jié):性能含義

一般而言,在物理設(shè)備上設(shè)計(jì)如何放置表空間和容器時(shí),目標(biāo)是使 I/O 并行性和緩沖區(qū)利用率達(dá)到最優(yōu)。要實(shí)現(xiàn)這個(gè)目標(biāo),應(yīng)當(dāng)全面了解數(shù)據(jù)庫(kù)設(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ù)庫(kù)的物理布局應(yīng)當(dāng)從設(shè)計(jì)表空間的組織開始:

  1. 第一步是確定表設(shè)計(jì)所給出的約束。這些可能會(huì)導(dǎo)致必須使用多個(gè)常規(guī)表空間。
  2. 第二步是考慮如果讓表空間中的表具有不同的設(shè)置,是否有可能顯著提高性能。
  3. 一旦作出了一個(gè)試驗(yàn)性的表空間設(shè)計(jì),那么就必須考慮緩沖池的利用率。這可能會(huì)使前面的表空間設(shè)計(jì)產(chǎn)生一些變化。
  4. 最后,必須給表空間分配容器。

這個(gè)是一個(gè)有反復(fù)的過程,應(yīng)該通過壓力測(cè)試和基準(zhǔn)測(cè)試驗(yàn)證該設(shè)計(jì)。很顯然,實(shí)現(xiàn)最佳的設(shè)計(jì)可能需要花費(fèi)大量精力,并且僅當(dāng)數(shù)據(jù)庫(kù)性能必須可能是最佳時(shí)才能證明設(shè)計(jì)是最佳的。通常:

  • 從最簡(jiǎn)單的可行設(shè)計(jì)入手。
  • 只有根據(jù)測(cè)試證明有充分的性能理由時(shí)才增加復(fù)雜性。

通常,為了降低管理和保持一個(gè)較為簡(jiǎn)單的數(shù)據(jù)庫(kù)設(shè)計(jì)的復(fù)雜性,稍微降低一點(diǎn)性能是值得的。DB2 具有一種非常成熟的資源管理邏輯,往往不用進(jìn)行精心的設(shè)計(jì)就能產(chǎn)生非常好的性能。

表空間組織

通常應(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ú)立的表空間中是否有意義。每張表根據(jù)自己被最頻繁訪問的方式,可以具有一組最有效的表空間設(shè)置:PAGESIZE、EXTENTSIZE 和 PREFETCHSIZE。上面已介紹了 PAGESIZE。EXTENTSIZE 是在將數(shù)據(jù)寫入到下一個(gè)容器之前寫入到當(dāng)前容器中的數(shù)據(jù)的頁數(shù)(如果表空間中存在多個(gè)容器的話)。

PREFETCHSIZE 指定在執(zhí)行數(shù)據(jù)預(yù)取時(shí)將從表空間讀取的頁數(shù)。當(dāng)數(shù)據(jù)庫(kù)管理器確定順序 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ù)庫(kù)有許多頻繁使用的小型表,這些表通常全部都位于緩沖區(qū)中,因此訪問起來就非常快。現(xiàn)在讓我們假設(shè)有一個(gè)針對(duì)非常大的表運(yùn)行的查詢,它使用同一個(gè)緩沖池并且需要讀取比總的緩存區(qū)大小還多的頁。當(dāng)查詢運(yùn)行時(shí),來自這些頻繁使用的小型表的頁將會(huì)丟失,這使得再次需要這些數(shù)據(jù)時(shí)就必須重新讀取它們。

如果小型表擁有自己的緩沖池,那么它們就必須擁有自己的表空間,因此大型查詢就不能覆蓋它們的頁。這有可能產(chǎn)生更好的整體系統(tǒng)性能,雖然這會(huì)對(duì)大型查詢?cè)斐梢恍┬〉呢?fù)面影響。經(jīng)常性地進(jìn)行調(diào)優(yōu)是為了實(shí)現(xiàn)整體的性能提高而在不同的系統(tǒng)功能之間做出的權(quán)衡。區(qū)分功能的優(yōu)先級(jí)并記住總吞吐量和使用情況,同時(shí)對(duì)系統(tǒng)性能進(jìn)行調(diào)整,這是非常重要的。

V8 所引入的新功能能夠在不關(guān)閉數(shù)據(jù)庫(kù)的情況下更改緩沖池大小。帶有 IMMEDIATE 選項(xiàng)的 altER BUFFERPOOL 語句會(huì)立刻生效,只要數(shù)據(jù)庫(kù)共享的內(nèi)存中有足夠的保留空間可以分配給新空間。可以使用這個(gè)功能,根據(jù)使用過程中的周期變化(例如從白天的交互式使用轉(zhuǎn)換到夜間的批處理工作)來調(diào)優(yōu)數(shù)據(jù)庫(kù)性能。

物理存儲(chǔ)器組織

一旦將表分布到多個(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ù)庫(kù)配置參數(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)境。通過執(zhí)行下面這個(gè)命令,可以在一個(gè)容器中啟用 I/O 并行性:

db2set DB2_PARALLEL_IO=*

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

至于性能評(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)存中,并確保以最有效的方式利用它們。

有關(guān)移動(dòng)數(shù)據(jù)庫(kù)的考慮事項(xiàng)

在將數(shù)據(jù)庫(kù)移到另一個(gè)系統(tǒng)之前,始終應(yīng)該重新評(píng)估它的調(diào)優(yōu)參數(shù)和物理組織,即便這些系統(tǒng)是同一種平臺(tái)也應(yīng)如此。在實(shí)際情況中,DBA 將經(jīng)過良好調(diào)優(yōu)的數(shù)據(jù)庫(kù)從具有 1 GB 內(nèi)存的 Windows 服務(wù)器復(fù)制到具有 256 MB 內(nèi)存的膝上型計(jì)算機(jī)中。在服務(wù)器上進(jìn)行連接所花的時(shí)間小于一秒,而在膝上型計(jì)算機(jī)中卻要用掉 45 分鐘。通過減少緩沖池大小和其它內(nèi)存參數(shù)就能解決這個(gè)問題。

如果平臺(tái)不一樣,那么這個(gè)問題就變得更難了。即使是在 UNIX 和 Windows 之間進(jìn)行移動(dòng),在一個(gè)系統(tǒng)上已是最佳性能,在另一個(gè)系統(tǒng)上卻未必如此。如果復(fù)制數(shù)據(jù)庫(kù)是為了進(jìn)行生產(chǎn),那么應(yīng)當(dāng)重復(fù)調(diào)優(yōu)過程。如果必須將數(shù)據(jù)庫(kù)移到 zSeries?,那么這里討論的某些內(nèi)容則不適用,而應(yīng)該參考有關(guān)的手冊(cè)和紅皮書。在 iSeries 系統(tǒng)上,物理設(shè)置和調(diào)優(yōu)是在數(shù)據(jù)庫(kù)環(huán)境之外一起完成的,應(yīng)當(dāng)參考 iSeries? 系統(tǒng)管理手冊(cè)。

結(jié)束語

我們?cè)诒疚闹薪榻B了許多內(nèi)容,但是您應(yīng)當(dāng)了解的有關(guān)數(shù)據(jù)庫(kù)設(shè)計(jì)和性能的知識(shí)決不僅限于此。我們著重討論了數(shù)據(jù)庫(kù)設(shè)計(jì)的兩個(gè)比較大的問題,而沒有深入研究查詢優(yōu)化和應(yīng)用程序考慮事項(xiàng)的細(xì)節(jié)。設(shè)計(jì)數(shù)據(jù)庫(kù)是第一位的,因?yàn)檫@是其它所有事情的前提,因此您的初始規(guī)劃應(yīng)該非常全面。為了方便您的學(xué)習(xí),我們?cè)谙旅嫣峁┝似渌?lián)機(jī)參考資料,這樣您就可以繼續(xù)學(xué)習(xí)有關(guān)本主題的內(nèi)容。

本文轉(zhuǎn)載自IBM官方網(wǎng)站,原文地址:https://www.ibm.com/developerworks/cn/data/library/techarticles/0212wieser/0212wieser.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容