1. 程式人生 > >db2 表空間 緩衝池

db2 表空間 緩衝池

簡介



對於剛涉足 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 KB4 005 50064 GB
8 KB8 101 1 012128 GB
16 KB16 293 1 012256 GB
32 KB32 677 1 012512 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
要列出容器,我們需要使用以上輸出中的 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 語句的一個示例:
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

第 2 節:效能含義

一般而言,在物理裝置上設計如何放置表空間和容器時,目標是使 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 應當是 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™ 系統管理手冊。

結束語

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

參考文件

http://www.ibm.com/developerworks/cn/data/library/techarticles/0212wieser/0212wieser.html

DB2 開發者園地的文章:


--------

DB2 9.7 中如何將資料庫管理表空間轉換為自動儲存表空間

簡介

IBM DB2 for Linux, Unix, and Windows 9.7 (DB2 9.7) 於 2009 年 6 月份正式釋出。這版資料庫對 DB2 V9.5 的新特性進行了增強,同時增加許多激動人心的特性。這些增強和新特性概括起來主要表現在三方面:降低成本,可信賴,易用。DB2 9.7 在幫助客戶實現自身業務的同時可以大大節約維護成本和 IT 運營開銷。
為了簡化表空間的管理,從 DB2 V8.2.2 開始,DB2 引入了自動儲存的概念。自動儲存允許 DBA 在資料庫級別指定在建立表空間時使用的儲存路徑,在建立表空間時不必顯式地定義表空間的位置和大小,資料庫系統可以在使用過程中自動分配和調整表空間。在 DB2 V9 中,自動儲存已經變為資料庫的預設選項,資料庫在建立時會預設啟用自動儲存,除非顯式的改變該選項。自動儲存在保持了效能的同時大大的簡化了 DBA 的工作,DBA 可以在資料庫級別管理表空間的儲存,表空間容器選擇分配等工作由資料庫管理器自動完成。在 DB2 9.7 以前,自動儲存只能在資料庫建立時啟用,自動儲存表空間也只能在建立時確定,DBA 在運維過程中不能改變資料庫和表空間的型別。這個限制使已經建立的非自動儲存表空間不能享受到自動儲存特性所帶來的好處。在 DB2 9.7 中,對於原本不支援自動儲存的資料庫,DBA 可以用比較簡單的操作先將一個非自動儲存資料庫轉換為自動儲存資料庫,然後再將一個數據庫管理表空間轉換為自動儲存表空間。對於已經支援自動儲存的資料庫,可以直接將一個數據庫管理表空間轉換為自動儲存表空間。本文將通過實際操作介紹啟用自動儲存的方法。

DB2 表空間型別

在介紹如何將資料庫管理表空間轉換為自動儲存表空間之前,我們先來回顧一下 DB2 表空間的各種型別以及各自的特點。
系統管理表空間 (System-Managed Space,SMS):這種型別的表空間由作業系統的檔案管理系統分配和管理空間。在 DB2 V9 之前,SMS 表空間是預設選項,如果不帶任何選項建立資料庫或表空間,資料庫管理器會自動將表空間建成系統管理表空間。建立 SMS 時,可以指定多個路徑做為表空間的容器,空間的大小隨資料量的變化由資料庫管理器自動調整。這種型別的表空間比較便於管理,但空間大小受到一定限制,效能在大多數情況下不如資料庫管理表空間。
資料庫管理的空間 (Database-Managed Space,DMS):這種表空間由 DB2 資料庫管理器負責管理儲存空間。表空間容器可使用檔案系統或裸裝置。在定義 DMS 表空間時,可以指定多個檔名以及每個檔案的大小,資料庫管理器建立並使用這些檔案作為表空間容器。表空間大小在建立時確定,空間不夠時要手工新增容器,對於以檔案作為容器的表空間可以指定 AUTORESIZE,從而在容器空間不夠時由資料庫管理器自動增加容器大小。這種表空間效能比較好,但需要在維護容器方面花費一些工作量。DMS 在需要經常關注和調整底層容器分配的場合有很大的靈活性。
自動儲存表空間 (Automatic Storage Spaces):自動儲存看起來是一種不同型別的表空間,但實際上是 DMS 和 SMS 的擴充套件。因為資料庫管理的空間 DMS 需要比較多的維護,在 DB2 V8.2.2 中引入了 DMS 自動儲存,以簡化表空間管理。這種型別的表空間既保持了 DMS 的高效能又具有 SMS 表空間易於管理的特點,可以大大簡化 DBA 的管理工作。自動儲存需要首先在資料庫級別啟用,在 DB2 V9 以後,自動儲存已經成為了 DB2 的預設設定,在建立資料庫時,DBA 可以提供一組路徑,在建立表空間時,資料庫管理器會在這些提供的路徑中建立需要的容器,容器的大小根據情況由資料庫管理器負責分配和管理。相比 DMS 而言,自動儲存表空間在容器管理方面十分簡便,可以滿足大多數表空間的使用需求。

讓資料庫支援自動儲存

使用自動儲存表空間的前提條件是要求資料庫需要支援自動儲存,在 DB2 9.7 以前,如果建立資料庫時沒有啟用自動儲存支援,那麼除了重建資料庫以外,沒有別的辦法可以再讓資料庫支援自動儲存了。在 DB2 9.7 我們直接使用 ALTER DATABASE 命令就可以使資料庫支援自動儲存。
清單 1. 讓資料庫支援自動儲存
 ALTER DATABASE < 資料庫名 > ADD STORAGE ON < 路徑 1> 
 [,< 路徑 2>,...,< 路徑 n>] 

例如:
 db2 "alter database testdb add storage 
 on '/db2/db6test/path1', '/db2/db6test/path2'"


我們從上述命令中可以看出,通過給資料庫增加儲存路徑就可以使資料庫支援自動儲存。我們需要注意:
  1. 我們不能刪除全部儲存路徑,因而也就意味著自動儲存一旦啟用就不能停止,如果我們試圖這樣做會出現 SQLSTATE 428HH 錯誤;
  2. 在增加儲存路徑以後,新路徑可能不會立刻被使用,需要手動重新分佈資料;
  3. 對於分割槽資料庫需要保證這些新添件的路徑在每個節點都存在並且有全部許可權。

將 DMS 轉換成自動儲存表空間

使資料庫支援自動儲存並不會自動把過去存在資料庫中的資料庫管理表空間轉換成為自動儲存表空間,我們還需要進行一些操作才能實現表空間的轉換。但 DB2 9.7 中只支援將 DMS 轉換為自動儲存表空間,還不能把系統管理表空間變為自動儲存表空間。轉換 DMS 的方法目前有兩種:
  1. 通過發出 ALTER TABLESPACE 命令,線上的將 DMS 轉換成自動儲存表空間;
  2. 通過資料庫恢復重定向離線的將 DMS 轉換成自動儲存表空間。

轉換自動儲存的線上方式

線上轉換表空間會保持表空間可用,但需要資料重新分佈,在轉換前我們可以通過 GET SNAPSHOT 命令查看錶空間的型別。
清單 2. 轉換前的表空間資訊
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
  Container Name = /db2/db6test/data1 
  Container ID = 0 
  。。。。。。
  Container Name = /db2/db6test/data2 
  Container ID = 1 
  。。。。。。
  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0, 1) 

拿表空間 TS1 為例,現在可以看到該表空間現在為 DMS 型別,有兩個表空間容器,這兩個表空間容器在一個 stripe set 裡。
第一步,使用 ALTER TABLESPACE 命令,在命令選項中指定 MANAGED BY AUTOMATIC STORAGE 來轉換表空間。
在我們發出 ALTER TABLESPACE 命令以後,表空間的發生了變化。
清單 3. 轉換後的表空間資訊
 db2 alter tablespace ts1 managed by automatic storage 
 DB20000I The SQL command completed successfully. 

 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。

 Container Name = /db2/db6test/data1 
  Container ID  = 0 
。。。。。。

  Container Name = /db2/db6test/data2 
  Container ID = 1 
。。。。。。

  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000004/C0000000.LRG 
  
  Container ID = 2 
。。。。。。

  Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000004/C0000001.LRG 
  
  Container ID = 3 
。。。。。。

  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0,1) 
  [ 1] [ 1] 7 15 511 7 7 0 2 (2,3)




從資料快照中我們看出,TS1 中又增加了兩個容器,它是由資料庫管理器根據資料庫級別的儲存路徑新建立的。同時又新生成了一個 sctripe set,包含了新增加的兩個容器。在資料庫沒有重新分佈以前,新增加的容器並不會馬上被使用。
第二步,使用 ALTER TABLESPACE 命令,在命令選項中制定 REBALANCE。
通過第一步我們已經將 DMS 轉換為自動儲存表空間,但使用者以前定義的容器和自動儲存生成的容器是並存的,這並不是我們想要得結果。如果使用者忽略第二步,今後在使用 ALTER TABLESPACE 加 REDUCE 選項時,資料庫可能會刪除掉未使用的新增加的兩個自動儲存容器。所以我們在轉換表空間以後必須執行第二步。第二步通常是個比較耗時的操作,這也是線上轉換表空間的代價。
清單 4. REBALANCE 後的表空間資訊
 db2 alter tablespace TS1 rebalance 
 DB20000I The SQL command completed successfully. 
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name  = TS1 
  Tablespace ID = 3 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
  。。。。。。
  Rebalancer Mode = No Rebalancing 
  。。。。。。

  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000003/C0000000.LRG 
  Container ID = 0 
  。。。。。。 
Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000003/C0000001.LRG 

  Container ID = 1 
。。。。。。

  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 5 191 0 2 0 2 (0,1)


從執行完 rebalance 的表空間快照中我們看到,過去的兩個資料庫管理表空間的容器消失了,只剩下了自動儲存的兩個容器,stripe set 也變為了一個。我們還應該注意快照中的 Rebalancer Mode,當前是 No Rebalancing,表示表空間的 rebalance 已經完成了。
通過以上的步驟,我們已經成功的把一個數據庫管理表空間線上的轉換為了自動儲存表空間。

轉換自動儲存的離線方式

除了線上轉換表空間,我們還可以通過資料庫的重定向恢復功能實現表空間的自動儲存轉換。使用這種方式我們不用進行表空間資料的 rebalance,但是在轉換期間如果是單個表空間轉換,會導致該表空間在轉換期間不可用。如果多個表空間需要轉換,在使用資料庫重定向恢復時會導致整個資料庫不可用。為了對比重定向前後的表空間情況,在進行轉換之前我們先來看看錶空間的當前狀態。
清單 5. 重定向恢復前的表空間資訊
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name = TS2 
  Tablespace ID = 5 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
  Container Name = /db2/db6test/data3 
  Container ID = 0 
。。。。。。
  Container Name = /db2/db6test/data4 
  Container ID = 1 
。。。。。。
  Table space map: 
  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0,1)


TS2 表空間當前使用兩個使用者指定的容器用於 DMS 型別的表空間。在這個基礎上通過下面 4 個步驟我們可以將這個表空間轉換成自動儲存表空間。


第一步,做一個數據庫或表空間的備份。
第二步,使用 redirect 選項恢復資料庫或表空間。
 RESTORE DATABASE database_name TABLESPACE table_space_name REDIRECT
第三步,在恢復過程中使用 SET TABLESPACE CONTAINERS 命令將 DMS 表空間改為自動儲存表空間。並繼續恢復資料庫或表空間。
 SET TABLESPACE CONTAINERS FOR tablespace_id USING AUTOMATIC STORAGE 
 RESTORE DATABASE database_name CONTINUE
第四步,對資料庫進行前滾恢復。
 ROLLFORWARD DATABASE database_name TO END OF LOGS AND STOP
清單 6. 使用資料庫重定向操作轉換表空間的例項
步驟一,
 db2 backup db testdb tablespace ts2 online to /db2/backup 
 Backup successful. The timestamp for this backup image is : 20091102012416 

步驟二,
 db2 "restore db testdb tablespace(ts2) from /db2/backup redirect"

 SQL1277W A redirected restore operation is being performed. Table space 
 configuration can now be viewed and table spaces that do not use automatic 
 storage can have their containers reconfigured. 

 DB20000I The RESTORE DATABASE command completed successfully. 

步驟三,
 db2 set tablespace containers for 5 using automatic storage 
 DB20000I The SET TABLESPACE CONTAINERS command completed successfully. 

 db2 restore database testdb continue 
 DB20000I The RESTORE DATABASE command completed successfully. 

步驟四,
 db2 rollforward db testdb to end of logs and stop 

  Rollforward Status 

 Input database alias = testdb 
 Number of nodes have returned status = 1 

 Node number = 0 
 Rollforward status = not pending 
 Next log file to be read = 
 Log files processed = - 
 Last committed transaction = 1970-01-01-00.00.00.000000 UTC 

 DB20000I The ROLLFORWARD command completed successfully.

在執行完以上的步驟,下面來看看資料庫重定向以後的表空間情況。
清單 7. 使用資料庫重定向操作後的表空間
 db2 get snapshot for tablespaces on testdb 
。。。。。。
 Tablespace name                            = TS2 
  Tablespace ID = 5 
  Tablespace Type = Database managed space 
  Tablespace Content Type = All permanent data. Large table space. 
。。。。。。
 Tablespace State = 0x'00000000'
。。。。。。
  Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000005/C0000000.LRG 

  Container ID = 0 
。。。。。。
  Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000005/C0000001.LRG
 
  Container ID = 1 
。。。。。。 
 Table space map: 

  Range Stripe Stripe Max Max Start End Adj. Containers 
  Number Set Offset Extent Page Stripe Stripe 
  [ 0] [ 0] 0 13 447 0 6 0 2 (0,1)

在快照中,我們看到,自動儲存的兩個容器已經取代了 DMS 過去的兩個容器,因而表空間已經成功的被轉換成了自動儲存型別。
轉換表空間時的注意事項及使用技巧
我們已經瞭解到如何將非自動儲存表空間轉換為自動儲存表空間的兩種基本方法。在使用這兩種方法的時候應該注意以下幾點:
  • 自動儲存一旦啟用就不能更改,因此,在轉換表空間前需要對使用需求進行全面考量;
  • 對於分割槽資料庫,自動儲存的路徑必須存在於所有節點;
  • 線上轉換表空間中的 REBALANCE 通常是一個比較耗時的過程,尤其是資料量比較大的表空間,所花費的時間會更長,系統資源消耗也很大。我們可以結合 throttling 功能來降低 REBANLANCE 對資料庫效能的影響;
  • 由於以前建立的資料庫中需要轉換的表空間比較多,我們可以在 SQL 語句中結合 MON_GET_TABLESPACE 函式或者通過 SYSIBMADM.SNAPTBSP 表來找到 TBSP_USING_AUTO_STORAGE 不為 1,且 TBSP_TYPE 為 DMS 的表空間批量的進行線上轉換;
  • l在通過資料庫重定向恢復轉換表空間時,我們也可以結合 GENERATE SCRIPT 選項,先生成模板指令碼,然後通過改寫模板指令碼來實現批量轉換。

總結

自動儲存特性可以大大減少 DBA 的負擔,提高資料庫的效能。本文通過實際操作,介紹了在 DB2 9.7 中,將資料庫管理表空間轉換為自動儲存表空間的兩種方法,通過轉換,可以使更多的 DB2 資料庫表空間享受到自動儲存特性帶來的好處。
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003liux/
------------------------------

深入理解DB2表空間(Tablespace)

表空間是資料庫系統中資料庫邏輯結構與作業系統物理結構之間建立對映的重要儲存結構,它作為資料庫與實際存放資料的容器之間的中間層,用於指明資料庫中資料的物理位置。任何資料庫的建立都必須顯式或隱式的為其指定表空間,且資料庫中的所有資料都位於表空間中。

使用者可以根據硬體環境以及成本等需求,通過指定建立在不同容器上的表空間來自由選擇資料的物理儲存位置。同時由於備份和恢復可以在表空間級別執行,使用者能夠進行更多粒度的備份恢復控制。

理解表空間前先理解容器。

容器(Container)

容器是物理儲存裝置,可以通過目錄名,裝置名或檔名進行標識。事實上,這也正是三種容器型別。裝置容器(如磁帶等)和檔案容器被同等看待,通常直接將其理解為資料檔案(磁碟儲存內部結構中有介紹,資料檔案中包含若干Extent。)。系統管理表空間只能使用目錄容器,資料庫管理表空間只能使用裝置容器和檔案容器。

容器被分配給某個表空間,單個表空間可以使用多個容器,但容器只能屬於一個表空間。容器通常位於本地磁碟上,某些遠端網路裝置或檔案也能作為表空間的容器,但由於網路延遲與可靠性方面的原因,遠端容器對資料庫安全與效能會造成影響,因此不建議使用遠端容器。

按照管理方式的不同對資料庫表空間型別進行了劃分

DB2資料庫系統的表空間有三種管理型別:

系統管理表空間(SMS,System-Managed Space)

SMS表空間由作業系統的檔案系統管理器分配並管理。在這種表空間中,資料儲存空間完全由作業系統管理,SMS表空間能夠使用的唯一容器是目錄容器,SMS表空間可以定義多個容器,目錄容器可以根據需要增加大小,因此SMS表空間的大小是可以動態增加的。但是一旦SMS表空間建立,就不能再為表空間增加或刪除容器了。SMS表空間中通常包含多個檔案,這些檔案代表了儲存在檔案系統空間中的表物件,比如表資料,表索引,表大物件都是單獨佔用一個或若干個檔案的。一旦為表指定了SMS表空間,那麼表中的資料就不允許分開儲存,即表的常規資料,索引,大物件資料不能位於不同的表空間中。在DB2 V9之前的資料庫版本中,建立資料庫(建立資料庫時如果不指定表空間則會預設建立3個表空間)或表空間的預設型別就是SMS表空間。另外,只有DB2資料庫允許有系統管理表空間,Oracle資料庫的表空間都是資料庫管理的,不存在系統管理表空間。

舉個SMS表空間的簡單例子:建立一個以containers1目錄為容器的SMS表空間MYSPACE。再建立一張表TEST,其常規資料,索引,大物件均位於MYSPACE表空間中(如果三者指定不同的表空間則表建立會失敗,事實上,指定了常規資料的表空間為SMS表空間後,索引和大物件的表空間也就默認了)。表建立完成後,物理磁碟上的資料是這樣的:


其中SQL00002.DAT資料檔案存放表中的常規資料;SQL00002.DTR資料檔案存放由於重組,表連線等產生的臨時資料。SQL00002.INX資料檔案存放表中的索引。還有LF字尾的存放LONG VARCHAR或LONG VARGRAPHIC資料,LB字尾的存放BLOB,CLOB和DBLOB資料,LBA字尾的存放LB字尾檔案的分配和可用空間資訊等。另外順便說下圖中的SQLTAG.NAM檔案。事實上每一個容器都有一個TAG資料結構用於標識容器屬於哪一個例項的哪一個資料庫的哪一個表空間。對於DMS表空間的容器,TAG位於第一個Extent內,對於SMS表空間的容器,則是以SQLTAG.NAM檔案的形式存在。

使用SMS表空間的每一個表都會在表空間的容器(也就是目錄)下對應產生一系列的SQL*.DAT ,SQL*.INX等檔案。表和其對應的檔案的資訊存放在SYSIBM.SYSTABLES這個系統編目表中,每個表對應一個FID(表所在的檔案組編號)和TID(表所在的表空間編號),可以使用查詢語句進行查詢:

Select fid,tid, name from sysibm.systables where name='TEST';

資料庫管理表空間(DMS,Database-Managed Space)

DMS表空間由資料庫管理系統(DBMS)自己管理控制,本質上講,這種型別的表空間是為了最大程度滿足資料庫管理器的需要而設計並實現的一種特定目的的檔案系統。DMS表空間是由有限數量的容器所組成的,DMS表空間可以使用的容器有裝置容器和檔案容器,這些容器的空間都是預先分配的且不允許修改大小的,但是與SMS表空間不同的是,DMS表空間允許新增容器。也就是說,SMS表空間和DMS表空間分別通過擴大容器大小和增加容器數量的方式實現表空間大小的增加。DMS表空間建立時需要手動指定一個或多個容器。以檔案為容器的表空間建立完以後就是一個單獨的檔案。使用DMS表空間的表的資料可以分開儲存,即為常規資料,索引和大物件資料指定不同的DMS表空間。

DMS自動儲存表空間(Automatic Storage DMS

自動儲存表空間不是真正意義上的獨立型別的表空間。它是DMS儲存的另外一種處理方法。DMS需要很多的維護操作,而自動儲存器則是作為一種簡化的空間管理手段,能夠自動進行表空間的管理維護,它是DB2 V8.8.2中引入的概念,目前取代SMS成為預設的表空間型別。

三種表空間的對比

三種表空間在各方面的區別是非常多的,下表顯示了一些主要的區別:


除了使用 SMS 表空間可以簡化管理之外,SMS和DMS儲存模型之間最顯著的差異是表空間的最大大小。在使用 SMS 時,DBA 最多隻能在表空間中放 64GB 的資料。將頁面大小改為 32K,可以將這個限制擴大到 512GB,但代價是每個頁面上的可用空間可能會更少。改為 DMS 模型會將表空間限制擴大到 2TB(4K 頁面大小的情況下)。如果將頁面大小改為 32K,可用空間可以增長到 16TB。儘管還有讓表大小突破 64GB 限制的其他方法,但是最簡單的方法可能是一開始就使用 DMS 表空間。(為什麼會有這些限制後面介紹)

DMS與自動儲存DMS

那麼DMS和自動儲存哪種方式更佳呢?自動儲存允許 DBA 為資料庫設定在建立所有表空間容器時可以使用的儲存路徑。DBA 不必顯式地定義表空間的位置和大小,系統將自動地分配表空間。在 DB2 9 中,資料庫在建立時將啟用自動儲存,除非 DBA 顯式地覆蓋這個設定。 
啟用自動儲存的資料庫有一個或多個相關聯的儲存路徑。表空間可以定義為 “由自動儲存進行管理”,它的容器由 DB2 根據這些儲存路徑進行分配。資料庫只能在建立時啟用自動儲存。對於在最初沒有啟用自動儲存的資料庫,不能在以後啟用這個特性。同樣,對於在最初啟用了自動儲存的資料庫,也不能在以後禁用這個特性。 
下面的表總結了管理非自動儲存和自動儲存之間的一些差異。


引入自動儲存模型的主要目的是簡化 DMS 表空間的管理,同時保持其效能特徵。有的時候 DBA 必須定義使用的表空間的所有特徵,但是許多應用程式都會從自動儲存提供的簡化管理獲益。
上述是按照管理方式的不同對資料庫表空間型別進行了劃分,事實上,根據用途的不同,表空間也可以劃分為五種型別:

根據用途的不同,表空間也可以劃分為五種型別

系統表空間(SYSCATSPACE)

系統表空間又稱為系統編目表空間,DB2系統編目表是DB2資料庫儲存所有DB2物件元資料的地方,在Oracle資料庫中,被稱為資料字典。而系統編目表就存放在系統表空間中。系統表空間是資料庫建立時自動建立的,且每個資料庫必須有且僅有一個系統表空間,系統表空間被強制命名為SYSCATSPACE。系統表空間預設是SMS表空間,也可以顯式指定為DMS表空間。

系統工具表空間(SYSTOOLSPACE)

系統工具表空間是供DB2管理工具和SQL管理例程使用的特定表空間,系統工具表空間不能被顯式建立,只有第一次使用下面任一工具或過程時才會自動建立:ADMIN_COPY_SCHEMA 過程 ,ADMIN_DROP_SCHEMA 過程, 管理任務排程程式, 改變表筆記本, ALTOBJ 過程, 自動重組(包括 db.tb_reorg_req 執行狀況指示器), 自動收集統計資訊(包括 db.tb_runstats_req 執行狀況指示器), 配置自動維護向導, db2look 命令, 設計顧問程式, GET_DBSIZE_INFO 過程, 儲存管理工具,SYSINSTALLOBJECTS 過程。其中管理任務排程程式、ADMIN_COPY_SCHEMA 和 ADMIN_DROP_SCHEMA 過程的首次使用不會建立系統工具表空間,但是他們使用的是系統工具表空間。

使用者表空間(USERSPACE)

使用者表空間也是資料庫建立時自動建立的,表空間名稱為USERSPACE1,資料庫中的使用者表預設存放於這個表空間中,使用者表空間是可選的,一個數據庫可以有多個使用者表空間。必須至少有一個使用者表空間(沒有使用者表空間的話資料庫無法存放使用者資料)。使用者表空間也可以是SMS表空間或DMS表空間,通常使用DMS表空間。

臨時表空間(TEMPSPACE)

臨時表空間也是資料庫建立時自動建立的,資料庫管理器使用臨時表空間在執行SQL操作時儲存臨時資料,例如排序,表重組,索引建立以及錶鏈接等操作所產生的中間表都由臨時表空間儲存,資料庫必須至少有一個臨時表空間,也可以有多個。建立資料庫時預設建立的臨時表空間名稱為TEMPSPACE1,且為SMS表空間。但是這個表空間的名稱可以是任意的,當另外的臨時表空間被建立後,該預設臨時表空間也可以被刪除。(但必須保證資料庫有一個臨時表空間)。臨時表空間也可以是DMS表空間。另外,DB2支援系統臨時表空間和使用者臨時表空間兩種型別,系統臨時表空間必須存在,使用者臨時表空間可以有0個或多個,用來宣告臨時表。

除了根據管理和用途劃分表空間型別,還可以根據容量將表空間劃分為常規表空間和大型表空間。但是這裡的常規表空間和大型表空間都是針對DMS表空間而言,SMS表空間大小上限還不及常規表空間。

行指標

首先考慮一個問題:邏輯上,資料以資料行(元組)的形式儲存在資料庫的表中,但物理上,根據資料庫磁碟儲存的知識(資料庫深入學習筆記----磁碟儲存內部結構),資料肯定是儲存在資料檔案上的,確切的說是儲存在資料塊(頁)上。那麼,資料庫是如何根據表中的行定址到物理磁碟上資料頁中的資料呢?

Oracle和DB2的解決方案是使用一種新的資料結構:行指標(或行指示器),Oracle資料庫中稱為ROWID,DB2中稱為RID。在實際的資料庫表中,每張表都會附加一個特定的隱藏列,即行指標列,也就是說,每一行資料都有一個行指標屬性,它指向該行資料在物理磁碟中的具體位置。實際上不管是Oracle還是DB2,行指標都是可以參與SQL查詢的(畢竟是有效的行屬性。Oracle中的ROWID可以直接當作屬性進行查詢,DB2中則需要使用rid函式查詢RID)如下圖是DB2資料庫的RID格式:


根據容量將表