數據庫由稱爲表空間的部件組成。表空間是用來存儲表的位置。當建立表時,您能夠決定將特定對象(如索引和大對象)數據與其他表數據分開存放。表空間也能夠分佈在一個或多個物理存儲設備上。node
咱們這一節主要講講如何建立表空間(如須要使用什麼樣的參數來建立最適用的表空間)web
表空間可分爲SMS表空間和DMS表空間,數據庫
簡單來講,SMS表空間易於管理,DMS表空間性能更優。緩存
SMS表空間:安全
1)根據須要,系統按需分配;併發
2)因爲沒必要預約義容器,所以建立表空間須要的初始工做少。ide
3)經過操做系統來管理空間,邏輯上數據是連續的,但物理上不是。佈局
DMS表空間:性能
1)可經過ALTER TABLESPACE來添加或擴展容器來增長表空間大小,現有數據能夠在新添加的容器集合中從新平衡以保持最佳I/O效率。fetch
2)可將數據分割存放在多個表空間中以提升性能和空間存儲容量。
3)可控制數據在磁盤上的位置(需操做系統容許)
4)精心設計的DMS性能優於SMS表空間(涉及大量DML操做的應用程序,建議使用DMS表空間)
5)數據在物理磁盤上是連續的。
注:對於我的數據庫用SMS表空間管理最容易。對於不斷增加的大型數據庫,建議使用SMS表空間作臨時表空間和系統編目表空間,而將具備多個容器的單獨的DMS表空間用於每一個表。另外建議將長字段(LF)數據和索引存儲在它們本身的表空間中。
SMS表空間:
計劃在一個表空間中存儲許多小表,應考慮使用SMS表空間。(對於小標,DMS表如今I/O和空間管理效率方面優勢沒有那麼重要)
DMS表空間:
表較大或者須要更快地訪問表中的數據,應考慮具備較小擴展數據塊大小的DMS表空間。
1)有的表包含不常用的歷史記錄數據,用戶可能願意接受較長的響應時間。能夠爲歷史記錄表使用單獨的表空間,並分配給訪問速率較低的較便宜的物理設備。
2)有些表須要數據快速響應,須要將這些表分配給快速物理設備的表空間中。可使用固態硬盤來存放訪問最頻繁的表。
3)使用DMS表空間,能夠將表數據分發在3個不一樣的表空間中:
一個存儲索引數據;
一個存儲大對象(LOB)和長字段(LF)數據;
一個存儲常規表數據。
(若是將表分佈在各個DMS表空間中,在啓用表空間級備份恢復時,應考慮一塊兒備份和復原那些表空間。SMS表空間不支持以此方式將數據分發在全部表空間中)。
若是須要常常刪除並從新建立特定表,應給這樣的表表單首創建DMS表空間,由於刪除DMS表空間比刪除表更有效率。
數據頁可選擇使用4KB、8KB、16KB、32KB頁大小,在選擇數據頁大小時須要綜合考慮空間需求和業務類型(性能需求)以作出選擇。
DB2中每一個頁大小限定了可存儲行的最大長度和可存儲表空間的最大值,因此選擇頁大小的時候須要考慮這些。
4KB – 最大可存放的行長度是4005字節
表空間特定於頁大小的限制 |
||||
表空間類型 |
4KB |
8KB |
16KB |
32KB |
SMS表空間 |
64GB |
128GB |
256GB |
512GB |
DMS表空間(常規) |
64GB |
128GB |
256GB |
512GB |
DMS表空間(大型) |
8TB |
16TB |
32TB |
64TB |
自動存儲表空間(常規) |
64GB |
128GB |
256GB |
512GB |
自動存儲表空間(大型) |
8TB |
16TB |
32TB |
64TB |
臨時表空間 |
64GB |
128GB |
256GB |
512GB |
數據頁大小選擇不當,可能形成空間浪費。
建議常見表表空間時,儘可能建立大型表空間,大型表空間的數據頁能夠存放更多的容量和行數。
聯機事務處理(OLTP)工做負載的特徵:事務須要對數據進行隨機訪問,涉及頻繁插入或更新活動和返回一小組數據的查詢。對於性能要求很高的OLTP應用,能夠考慮把一些頻繁訪問的表建立在固態硬盤上。(使用裸設備容器的DMS表空間在這種狀況下表現最好)
OLAP查詢工做負載的特徵:事務須要對數據進行順序訪問或部分順序訪問,並常返回大的數據集。(使用多個設備容器且每一個容器都在單獨磁盤上的DMS表空間最有可能提供有效的並行預存取)。應將PREFETCHSIZE參數的值設爲EXTENTSIZE參數的值乘以容器設備數之積。並能夠將預取大小設置爲-1(AUTOMATIC),這容許數據庫管理器以並行方式從全部容器中預取。若是容器數目發生更改,或須要使預取更多或更少,那麼可使用ALTER TABLESPACE語句響應地更改PREFETCHSIZE值;強烈建議把PREFETCHSIZE設置爲AUTOMATIC或-1。
混合工做負載的目標:對於OLTP工做負載,使單個I/O請求儘量有效率;對於OLAP查詢工做負載,最大程度地提升並行I/O的效率。
1) 對於執行隨機行讀寫操做的OLTP應用程序,一般最好使用較小的頁大小(4KB、8KB),這樣不須要的行就不會浪費緩衝池空間;
2) 對於一次訪問大量連續行的決策支持系統(DSS)和OLAP應用程序,頁大小大點(16KB、32KB)比較好,這樣能減小讀取特定數目的行所需的I/O請求數。較大的頁大小還容許減小索引中的層數,由於在一頁中能夠保留更多的行指針。
3) 越大的頁,支持的行越長。應根據業務需求選擇合適的數據頁。
4) 4KB – 表有500列;8KB、16KB、32KB支持1012列。
5) 表空間最大大小與表空間的頁大小成正比(參考表3-3)
EXTENTSIZE指定在跳到下一個容器以前能夠寫入容器PAGESIZE頁面的數量。存儲數據時數據庫管理器反覆均衡使用全部容器。該參數只有在表空間中有多個容器時才起做用。合理的EXTENTSIZE會對錶空間的性能產生重大影響。這個參數只能在建立表空間時定義,以後不能修改。
如下經驗法則創建在表空間中每一個表的平均大小的基礎上:
1) 若是小於50MB,EXTENTSIZE爲8
2) 若是介於50MB到500MB之間,EXTENTSIZE爲16
3) 若是介於500MB到5GB之間,EXTENTSIZE爲32
4) 若是大於5GB,EXTENTSIZE爲64
對於OLAP數據庫和大部分對錶的訪問包括許多查詢或處理大量數據的事物(僅限於查詢)的表,或者增加速度很快的表,從表中預取數據能夠顯著改善性能,應使用較大的extent,反之,使用較小的extent。
爲了提升緩衝池命中率,數據庫經過預取操做再查詢使用所需的數據以前讀入這些數據,由於數據已經存在於內存,查詢在使用這些數據的時候就沒必要等待執行I/O了。數據庫管理器會肯定預取操做是否有助於提升性能。
經過ALTER TABLEPSPACE能夠修改預取大小。通常最優設置以下:
Prefetch Size = (# Containers of the table space on different physical disks) * Extent Size
若是表空間駐留在某個磁盤陣列上,那按以下設置:
Prefetch Size = Extent Size * (# of non-parity disks in array)
注:DB2 V9版本之後,能夠在建立表空間時自動預取大小。
在添加或刪除容器後,要及時更新表空間的預取大小,不然數據庫性能會明顯下降。能夠在建立表空間時指定Prefetchsize 爲 Automatic,這樣能夠設置自動預取大小。可經過如下方法查看是否設置自動預取:
db2 get snapshot for tablespaces on dbname| more
Prefetchsize的大小設置和Extentsize的設置有關,因此須要合理設置 Extentsize大小,再根據Extentsize大小設置Prefetchsize。較好的建議是建立數據庫時採用自動存儲,這樣數據庫管理器可自動設置Prefetchsize和Extentsize的大小。
在建立DMS表空間容器時能夠選擇使用文件系統或裸設備。
爲避免操做系統作多一次緩存(數據庫已經經過buffer pool作了一次緩存),能夠採用裸設備做爲數據文件的存儲設備。裸設備也稱爲裸分區(Raw Partition),是沒有被加載(mount)到操做系統的文件系統中的磁盤分區,經過字符設備驅動來訪問。裸設備的I/O讀寫不禁操做系統控制,而是由應用系統(如數據庫)直接控制。
裸設備的優勢:
1. 具備更好的性能(屏蔽了文件系統緩衝區而進行直接讀寫)。對硬盤的直接讀寫意味着取消了硬盤與文件系統的同步需求。這一點對於純OLTP系統很是有用,由於這種系統的讀寫隨機性很是大,以致於一旦數據被讀寫以後,在從此較長一段時間內不會再次使用。改善決策支持系統(DSS)應用程序的性能:
² 排序:DSS環境存在大量排序需求,裸設備提供的直接讀寫功能很是有用,由於對臨時表空間的寫動做速度更快。
² 順序訪問:裸設備很是適合順序I/O動做。DSS中常見順序I/O(表/索引的全表掃描)
2. 直接讀寫,不須要通過操做系統級的緩存。
3. 避免了操做系統的cache預讀功能,減小了I/O。
4. 避免了文件系統的開銷,好比維護i-node、空閒塊等。
裸設備的缺點:
1. 裸設備的空間大小管理不靈活。須要預先規劃裸設備的空間使用,還應當保留一部分裸設備以應付突發狀況。
2. 須要操做系統root用戶干預,由於裸設備的建立、更改權限、擴展大小等都須要由root用戶完成,這增長的了管理成本。
文件系統的優勢:
易於管理和維護,好比文件的基本管理以及安全和備份等。
文件系統的缺點:
性能比不上裸設備
選擇表空間容器時,從性能上考慮儘可能採用裸設備;若是使用自動存儲方式建立數據庫和表空間,則不支持裸設備。或者爲了便於管理而採用文件系統方式,這時須要合理設置文件系統相關選項和表空間相關選項。
直接I/O(DIO)能夠繞過在文件系統級別進行高速緩存,所以能改進內存性能。此過程可減小CPU開銷並使得更多的內存可用於數據庫實例。
併發I/O(CIO)具備DIO的優勢,而且可消除串行化寫訪問。與使用文件系統緩衝I/O相比,在具備大量事務處理工做負載和回滾時,CIO/DIO機制可增大吞吐量。
注:DIO和CIO具體的支持列表查看最新的DB2信息中心。
關鍵字 NO FILE SYSTEM CACHING 和 FILE SYSTEM CACHING是CREATE 和 ALTER TABLEPACE 語句的一部分。
當 NO FILE SYSTEM CACHING有效時,只要可能,數據庫管理器會嘗試使用「併發I/O(CIO)」。在不支持CIO時,(例如使用了JFS)將取而代之使用DIO。
建議在表空間級別啓用或禁用操做系統中的非緩衝I/O。這將容許在特定表空間上啓用或禁用非緩衝I/O,同時可避免數據庫物理佈局中的任何依賴性。另外還可容許數據庫管理器肯定每一個文件最適合使用哪一種I/O,緩衝的仍是非緩衝的。
NO FILE SYSTEM CACHING子句用於啓用非緩衝I/O,從而禁用特定表空間的文件高速緩存。一旦啓用非緩衝I/O,數據庫管理器會根據平臺自動肯定將使用直接I/O仍是併發I/O。使用CIO可提升性能,只要CIO受支持,數據庫管理器就會啓用。
FILE SYSTEM CACHING通常用於應用程序檢索LOB和LONG數據,這些大對象數據不能通過數據庫緩衝池。
查看是否啓用FILE SYSTEM CACHING屬性,可以使用:
db2 get snapshot for tablespaces on <dbname>|more
db2pd -d <dbname> -tablespaces
db2look -d <dbname> l
建議建立表空間時,表空間的容器採用裸設備或支持併發I/O或直接I/O的文件系統。
這兩個參數用於肯定查詢優化期間的I/O成本。這兩個值的測量單位都是毫秒,並且它們是全部容器開銷和傳送速率的平均值。開銷是與I/O控制器活動、磁盤尋道時間和旋轉延遲時間相關聯的時間。傳送速率是將一頁讀入內存所必須的時間量。它們的默認值分別是24.1和0.9。可根據硬件規格計算這些值:
Transrate = (1/傳送速率)*1000/1024000*4096(假設用4KB頁大小)
Overhead = 平均尋道時間+((1/磁盤轉速)*60*1000)/2)
平均尋道時間、磁盤旋轉速度和傳送速率是由硬盤自己決定(可經過操做系統命令或從硬盤廠商得到底層硬盤的物理特性)
因此合理設置這兩個值,可以讓優化器瞭解底層存儲的物理特性,從而制定最優的執行計劃。
如今不少應用系統吧數據庫存放在「獨立磁盤冗餘陣列」(RAID)設備上,要優化存放在RAID設備上的表空間性能,可遵循如下準則:
1. 在一組RAID設備上建立表空間時,應該把表空間容器建立在多個RAID GROUP上。
2. 爲表空間選擇適當的擴展數據塊(extent)大小。理想狀態下,擴展數據塊大小應該等於磁盤底層strip大小或其倍數,其中strip大小等於strip大小乘以活動磁盤數。Strip大小表示磁盤控制器在向一個物理磁盤寫入多少數據後才轉向下一個物理磁盤。
若是strip大小爲64KB,頁大小爲16KB,那適當的擴展數據塊大小多是256KB(64KB*4)
3. 使用DB2_PARALLEL_IO註冊變量爲全部表空間啓用並行I/O,併爲每一個容器指定物理磁盤數。
DB2_PARALLEL_IO註冊變量用來肯定每一個容器的底層物理硬盤數以及對錶空間上並行I/O的影響。當爲表空間設置多個容器或者設置DB2_PARALLEL_IO註冊變量時,會爲表空間啓動並行預取。如未設置DB2_PARALLEL_IO,那表空間的並行度與容器數目相等。不然,表空間的並行度由表空間預取大小和EXTENT大小決定,建議將預取大小設置爲AUTOMATIC,由DB2自動計算預取大小,讓DB2選擇最合適的並行度。
DB2_PARALLEL_IO = TablespaceID:[n],若是沒有指定n,那麼使用默認值6(就是假設容器跨越6個RAID底層物理磁盤)。
DB2_PARALLEL_IO =* (*表示全部表空間均啓用並行I/O,沒有指定n,因此全部表空間使用容器磁盤數目等於6的默認值。將預取請求分解成「6x容器數目」個並行請求,每一個請求的讀取大小爲extent大小。
DB2_PARALLEL_IO =*:3 (*表示全部表空間均啓用並行I/O,3表示全部表空間使用容器磁盤數目等於3。將預取請求分解成「3x容器數目」個並行請求,每一個請求的讀取大小爲extent大小。)
DB2_PARALLEL_IO =*:3 1:1 (*表示全部表空間均啓用並行I/O,3表示全部表空間使用容器磁盤數目等於3。將預取請求分解成「3x容器數目」個並行請求,每一個請求的讀取大小爲extent大小。對於ID爲1的表空間,將預取請求分解成「1x容器數目」個並行請求,每一個請求的讀取大小爲extent大小。)
若是將表空間的預取大小設置爲AUTOMATIC, 那麼數據庫管理器將使用爲DB2_PARALLEL_IO 指定的物理磁盤數值來肯定預取大小值。若是預取大小未設置爲AUTOMATIC,能夠手動設置,需考慮RAID條帶大小,它是strip大小乘以活動磁盤數產生的值:
l 等於RAID條帶大小乘以RAID並行設備數(或此乘積的整數表示)
l 是擴展數據塊的大小的整數表示。
不要設置DB2_USE_PAGE_CONTAINER_TAG註冊變量,若是設置爲ON,將使用單頁容器標記,而且擴展數據塊不會與RAID條帶對其。 應使用等於RAID條帶大小或其倍數的擴展數據塊大小來建立表空間。
說了那麼多建表空間的參數選擇,下面咱們舉例子來實際操做,如下是建立表空間的完整語句:
建立單區的表空間
CREATE REGULAR TABLESPACE "TBS_BASS_WEB" IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 32768 MANAGED BY DATABASE
USING (FILE '/db2home/db2inst1/db2inst1/NODE0000/tbs_bass_web'655360,
FILE '/db2home/db2inst1/db2inst1/NODE0000/tbs_bass_web1'655360,
FILE '/db2data/tbs/tbs_bass_web7'655360,
FILE '/db2data/tbs/tbs_bass_web8'655360)
EXTENTSIZE 32
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BASS_WEB
OVERHEAD 24.100000
TRANSFERRATE 0.900000
FILE SYSTEM CACHING
DROPPED TABLE RECOVERY ON;
建立多分區的表空間(指定了多個分區 「DBPARTITIONNUMS」)
CREATE LARGE TABLESPACE "TBS_DWD" IN DATABASE PARTITION GROUP NDGRP11 PAGESIZE 32768 MANAGED BY DATABASE
USING (DEVICE '/dev/md/vgmt01/rdsk/d503' 655360,
DEVICE '/dev/md/vgmt01/rdsk/d509'655360,
DEVICE '/dev/md/vgmt01/rdsk/d510'6553600) ON DBPARTITIONNUMS (1)
USING (DEVICE '/dev/md/vgmt02/rdsk/d503' 655360,
DEVICE '/dev/md/vgmt02/rdsk/d509'655360,
DEVICE '/dev/md/vgmt02/rdsk/d510'6553600) ON DBPARTITIONNUMS (2)
USING (DEVICE '/dev/md/vgmt03/rdsk/d503' 655360,
DEVICE '/dev/md/vgmt03/rdsk/d509'655360,
DEVICE '/dev/md/vgmt03/rdsk/d510'6553600) ON DBPARTITIONNUMS (3)
USING (DEVICE '/dev/md/vgmt04/rdsk/d503' 655360,
DEVICE '/dev/md/vgmt04/rdsk/d509'655360,
DEVICE '/dev/md/vgmt04/rdsk/d510'6553600) ON DBPARTITIONNUMS (4)
EXTENTSIZE 16
PREFETCHSIZE 32
BUFFERPOOL POOL_32K
OVERHEAD 7.500000
TRANSFERRATE 0.060000
FILE SYSTEM CACHING
DROPPED TABLE RECOVERY ON;
若是不經過詳細的參數設置,也可使用如下簡單方式,其餘參數則會默認設置
db2 create tablespace test managed by DATABASE;
db2 create tablespace test managed by SYSTEM;
db2 create tablespace test managed by AUTOMATIC STORAGE;(自動存儲,自動分配容器)
注:在建立DMS表空間時,表空間文件容器由DB2自動來建立,但裸設備容器沒法自動建立,須要root用戶參與。
SMS和DMS表空間相比,SMS表空間特別適合通常用途。
SMS表空間可以提供必定的性能,且管理成本很低。
若是須要達到最佳的性能,則應該選用DMS表空間。
由於使用文件容器或者SMS表空間移動數據時會發生雙重緩衝(在數據庫管理程序級首先緩衝一次數據,而後在文件系統再緩衝一次數據,這就是雙重緩衝),因此使用設備容器可能提供更好的性能。
至於如何取捨,仍是要實事求是!