深入理解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格式:
常規資料表空間
在DB2 V9之前,RID具有4個位元組(32位)長度,其中3個位元組用於資料頁定址,最後1個位元組用於資料頁內槽號定址(《資料庫深入學習筆記----磁碟儲存內部結構》介紹過,每一行資料都是一條記錄,儲存在資料頁的資料存放區空間裡,每一條記錄都對應槽目錄中的一個槽號)。
由RID的結構我們就可以計算出資料頁能夠容納的記錄數(行數)和資料表空間的容量了:
因為一個RID只有1個位元組(8位)槽號,所以,一個資料頁儲存的記錄數的最大值為255條(2的8次方-1,為什麼要減1?這是因為磁碟儲存那篇文章已經講過,有的資料頁是會有一個可用空間控制記錄(FSCR)的,所以需要預留)。(說明:8位能定址的範圍就是0-255,槽號編號就只能是0-255,如果記錄再多,就無法被槽目錄編號了,無法被定址,資料存了也是白存。)
同理,可以根據3個位元組的頁號,得出一個資料表空間最多能容納16777216(16M,2的24次)個資料頁。那麼,如果是一個資料頁4KB的話,資料表空間大小就是16M*4KB=64GB了。如果一個資料頁32KB的話,就是16M*32KB=512GB。(DB2資料表空間支援的頁面大小有4KB,8KB,16KB和32KB四種,一個資料表空間只能使用一種大小的資料頁)
可以想象,如果資料庫表中的行長度(一行所佔用的儲存空間)太小,由於一個資料頁理論上最多隻能儲存255行(實際上,每一頁允許儲存的記錄數通常少於255條),那必然造成資料頁空間的浪費,比如4KB頁,長度為12B的行存滿頁面也只佔用12B*255=3060B的空間,剩下的1036KB多的空間只能浪費。下表顯示了頁面空間被浪費前的最小行長度:
一旦資料表空間中滿足了最大頁限制,有以下三種方案可供選擇:
1.在視圖中把這些表串連起來(多個資料表空間中的表在視圖中合在一起);
2.使用DB2的資料庫資料分割函數(DPF,Database Partitioning Feature),橫跨多個分區將資料進行組合;
3.使用定界分割表。
無論哪種方案都需要將一些資料進行遷移並可能對應用程式進行修改,這無疑是很繁瑣的。
大型資料表空間
為了能夠讓資料頁中容納更多的行(記錄)以及資料表空間中容納更多的資料頁,DB2 V9引入了一種新的行指標(RID,行指標)格式。資料頁標記由3個位元組增加到4個位元組,槽位由1個位元組增加到2個位元組,這種6位元組的RID格式最終將資料表空間大小上限擴充到原來的32倍。即4KB頁的資料表空間最大容量為2TB,32KB頁的資料表空間最大容量為16TB。同時,每個資料頁所能容納的行數理論上也擴大為65000多行,但由於規定每一行的最小長度為12B左右,所以,實際上4KB頁能容納的最大行數為4KB/12KB=341行左右,32KB頁則是2300行左右。
下表是4種頁實際用於儲存資料的空間大小和實際允許存放的行數:
這種RID格式很好的解決了資料表空間大小受限以及資料頁空間浪費(不再受制於槽號,而是行長度)的問題。但同時也帶來了管理上的挑戰,比如備份和恢複。事實上,當表開始增長到TB級的時候,就應該考慮使用一些諸如表分區,資料庫分區等技術來進行大型資料量的管理了。
使用舊的4位元組RID格式的資料表空間就是常規資料表空間,使用新的6位元組RID格式的資料表空間就是大型資料表空間了。DB2 V9中大型資料表空間是DMS資料表空間的預設類型,當然也可以顯式的建立常規資料表空間(指明資料表空間為REGULAR)。很顯然,SMS資料表空間是不可能支援大型資料表空間的。
支援6位元組RID格式的資料表空間包括:系統暫存資料表空間,使用者暫存資料表空間,使用者常規資料表空間。也就是說,只有系統資料表空間是不能建立為大型資料表空間的。因為目前的編目表不足以達到能夠及時保證較大的資料表空間大小的狀態。
大型資料表空間在DB2 V9之前叫長型資料表空間,用於儲存長型或 LOB 表列,以彌補常規資料表空間在處理長型或LOB資料上的不足。
常規資料表空間向大型資料表空間的遷移
DB2 V9不會自動將常規資料表空間升級為大型資料表空間,但是可以手動升級:ALTER TABLESPACE tablespacename CONVERT TO LARGE。
ALTER命令不會物理地改變資料表空間的結構,只是改變了編目方式以指示資料表空間可以支援6位元組的RID格式。要注意的是:
1.執行LARGE升級後需要立即COMMIT WORK,進行事務提交,否則資料表空間上會持有排它鎖,同時在該資料表空間中對錶所做的其他工作不會繼續執行,直到該鎖解除為止。
2.一旦資料表空間被修改為LARGE,為了更好的利用6位元組RID的優勢,還需要繼續資料重組和索引重組。如果不進行索引重組,那麼先前存在的表將延續每頁255行以及3位元組數量的限制,因為索引使用的仍是舊的RID,無法索引到超出原範圍的頁。而資料重組(表重組)與索引重組的影響不同,索引重組影響資料表空間中頁的數量,表重組影響的是頁中存放的行數。
本文永久更新連結地址: