如何建立DB2分區數據庫?(轉)


歡迎和大家交流技術相關問題:
郵箱: jiangxinnju@163.com
博客園地址: http://www.cnblogs.com/jiangxinnju
GitHub地址: https://github.com/jiangxincode
知乎地址: https://www.zhihu.com/people/jiangxinnju

 

原作:陳敏  2008-05-21

 

    熟悉IBM DB2 UDB的都知道,構築DB2數據庫對象的層次關系,既每台物理機器可以配置多個實例,而每個實例是一個獨立的運行環境,在每個實例下可以創建多個數據庫,每個數據庫可以有多個表空間,而數據庫中的表會存放在這些表空間中。那分區數據庫中他們的關系又如何,是如何分區的呢?本文就分區數據庫的基本概念做簡單介紹。
    有了數據庫分區后,在原來構築DB2數據庫對象的層次關系里發生了一些變化,實例增加了一個物理特性,就是實例所擁有的數據庫分區,為了使使用者能夠充分利用分區數據庫的特性,在數據庫和表空間之間增加了一層,——數據庫分區組。與之相關的名詞包括數據庫分區,數據庫分區組,分區映射,分區鍵,下面就詳細解釋一下:
數據庫分區
    首先說一下什么是數據庫分區,數據庫分區是DB2數據庫的一部分,由它自己的數據、索引、配置文件和事務日志組成。分區數據庫就是具有兩個或多個分區的數據庫。這樣,表就可以位於一個或多個數據庫分區中。與每個數據庫分區相關聯的處理器都用來滿足表請求。數據檢索和更新請求將自動分解為子請求,並在適當的數據庫分區中並行執行。
數據庫分區組
    數據庫分區組是一個或多個數據庫分區的集合。想要為數據庫創建表時,首先創建用來存儲表空間的數據庫分區組,然后創建用來存儲表的表空間。
    可以在數據庫中定義一個或多個數據庫分區組成的命名子集。您定義的每個子集稱為 數據庫分區組 。包含多個數據庫分區的每個子集稱為 多分區數據庫分區組 。多分區數據庫分區組只能使用屬於相同實例的數據庫分區定義。

   圖 1 給出了一個含五個分區的數據庫示例,在這個示例中:
• 數據庫分區組橫跨除一個數據庫分區外的所有其它分區(數據庫分區組 1)。
• 數據庫分區組包含一個數據庫分區(數據庫分區組 2)。
• 數據庫分區組包含兩個數據庫分區(數據庫分區組 3)。
• 數據庫分區組 2 中的數據庫分區與數據庫分區組 1 共享並與之相交。
• 數據庫分區組 3 中存在單個數據庫分區,該分區與數據庫分區組 1 共享並與之相交。
    可使用 CREATE DATABASE PARTITION GROUP 語句創建數據庫分區組。此語句指定表空間容器和表數據將駐留其上的一組數據庫分區。此語句還可以:
• 為數據庫分區組創建分區映射。
• 生成分區映射標識。
• 將記錄插入下列目錄表:
o SYSCAT.DBPARTITIONGROUPS
o SYSCAT.PARTITIONMAPS
o SYSCAT.DBPARTITIONGROUPDEF
    創建數據庫時創建的缺省數據庫分區組由數據庫管理器使用。IBMCATGROUP 是包含系統目錄的表空間的缺省數據庫分區組,只在主節點上(主數據庫分區)。IBMTEMPGROUP 是系統臨時表空間的缺省數據庫分區組,包含所有數據庫分區。
IBMDEFAULTGROUP 是包含用戶定義的表的表空間的缺省數據庫分區組,包含所有數據庫分區。
    通過將表空間放置在多分區數據庫分區組中,將該表空間內的所有表划分或分區到該數據庫分區組的每個分區中。由此該表空間被創建到了一個數據庫分區組中。一旦位於某個數據庫分區組中,該表空間就必須保留在該處;而不能更改至另一數據庫分區組。CREATE TABLESPACE 語句用於將表空間與數據庫分區組關聯。
建數據庫分區組示例:
CREATE DATABASE PARTITION GROUP MAXGROUP ON ALL DBPARTITIONNUMS
CREATE DATABASE PARTITION GROUP MEDGROUP ON DBPARTITIONNUMS( 0 TO 2, 5, 8)

分區映射
    在分區數據庫環境中,數據庫管理器必須具有弄清一個表的哪些行存儲在哪些數據庫分區上的方法。數據庫管理器必須知道到哪里去查找所需的數據,並使用一個稱為 分區映射 的映射來查找數據。
    分區映射是一個內部生成的數組,對於多分區數據庫分區組,它包含 4 096 個條目,對於單一分區數據庫分區組,只包含一個條目。對於單一分區數據庫分區組,分區映射只有一個條目,該條目包含存儲數據庫表的所有行的數據庫分區的分區號。對於多分區數據庫分區組,以循環方式指定數據庫分區組的分區號。正如使用網格將城市地圖划分為區一樣,數據庫管理器使用 分區鍵 來確定存儲數據的位置(數據庫分區)。
    例如,假定您將一個數據庫創建在四個數據庫分區(編號為 0-3)上。此數據庫的 IBMDEFAULTGROUP 數據庫分區組的分區映射將是:
0 1 2 3 0 1 2 ...
   若已使用數據庫分區 1 和 2 在該數據庫中創建了一個數據庫分區組,則該數據庫分區組的分區映射將是:
1 2 1 2 1 2 1 ...
    若要裝入數據庫的一個表的分區鍵是一個可能在范圍 1 至 500 000 之間的整數,則會將分區鍵散列至 0 至 4 095 之間的一個  分區號。將該編號用作分區映射中的索引,以選擇用於該行的數據庫分區。

    圖 2 顯示如何將具有分區鍵值 (c1, c2, c3) 的行映射至分區 2,然后引用數據庫分區 n5。
    分區映射可以靈活地控制將數據存儲在分區數據庫中的哪個位置。若將來需要更改數據庫中各數據庫分區上的數據分發,可以使用數據再分發實用程序。此實用程序允許重新平衡或調整數據分發的偏差。

分區鍵
    分區鍵 是一列(或一組列),用於確定將某行數據存儲在什么分區。分區鍵是使用 CREATE TABLE 語句在表上定義的。如果沒有為分布在數據庫分區組中的多個數據庫分區中的表空間中的表定義分區鍵,在缺省情況下將會根據主鍵的第一列創建分區鍵。若未指定主鍵,則缺省分區鍵是在該表中定義的第一個非長型字段列。( 長型 包括所有長型數據類型和所有大對象(LOB)數據類型)。若沒有列滿足缺省分區鍵的要求,則不會不帶鍵創建該表。
    好的表分區鍵就是將數據均勻分布在數據庫分區組中的所有數據庫分區上的分區鍵。不適當的分區鍵會導致數據分發不均勻。數據分發不均勻的列和含有少數特異值的列不應選作分區鍵。特異值的數目必須足夠大,才能確保將行均勻分布在數據庫分區組中的所有數據庫分區上。應用分區散列算法的成本與分區鍵的大小是成正比的。分區鍵不能超過 16 列,而且列越少,性能越好。不應將不需要的列包括在分區鍵中。
當定義分區鍵時,應該考慮下列幾點:
• 不支持創建只包含長型數據類型(LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB 或 DBCLOB)的多分區表。
• 不能改變分區鍵定義。
• 分區鍵應該包括最頻繁連接的列。
• 分區鍵應該由經常參與 GROUP BY 子句的列組成。
• 任何唯一鍵或主鍵必須包含所有分區鍵列。
• 在聯機事務處理(OLTP)環境中,分區鍵中的所有列都應該使用帶常量或主機變量的等於(=)謂詞來參與該事務。例如,假
定有一個在事務中經常使用的職員號 emp_no,如:
• UPDATE emp_table SET ... WHERE
emp_no = host-variable
散列分區 是確定分區表中每一行的位置的方法。該方法的原理如下:
1. 將散列算法應用於分區鍵的值,並生成介於 0 與 4095 之間的分區號。
2. 創建數據庫分區組時將創建分區映射。每個分區號依次以循環方式重復,以填寫該分區映射。
3. 該分區號用作分區映射中的一個索引。分區映射中該位置處的編號是存儲該行的數據庫分區的編號。
在分區數據庫中跨越幾個分區創建一個表在性能上有幾個優點。與檢索數據相關聯的工作可分成幾部分在各個數據庫分區中進行。
    必須小心地選擇適當的分區鍵,因為 以后再也不能更改它 。再者,必須將任何唯一索引(因此也是唯一鍵或主鍵)定義為分區鍵的一個超集。即,若定義了分區鍵,則唯一鍵和主鍵必須包括所有與分區鍵相同的列(它們可能有多列)。
    表的一個分區大小不能超過 64 GB 和可用的磁盤空間中較小的那一個。(假設表空間具有 4 KB 的頁大小。)該表的最大大小可以是 64 GB(或可用磁盤空間)乘以數據庫分區數之積。若該表空間的頁大小為 8 KB,則該表最大的大小可以為 128 GB(或可用的磁盤空間)乘以數據庫分區數之積。若該表空間的頁大小為 16 KB,則該表的最大大小可為 256 GB(或可用的磁盤空間)乘以數據庫分區數之積。若該表空間的頁大小為 32 KB,則該表的最大大小可為 512 GB(或可用的磁盤空間)乘以數據庫分區數之積。
以下是一個示例:
CREATE TABLE MIXREC (MIX_CNTL INTEGER NOT NULL,
MIX_DESC CHAR(20) NOT NULL,
MIX_CHR CHAR(9) NOT NULL,
MIX_INT INTEGER NOT NULL,
MIX_TMSTMP TIMESTAMP NOT NULL)
IN MIXTS12
PARTITIONING KEY (MIX_INT) USING HASHING
    在上一個示例中,表空間是 MIXTS12,而分區鍵是 MIX_INT。若未顯式指定分區鍵,則它是 MIX_CNTL。(若未指定主鍵且未定義分區鍵,則分區鍵是該列表中的第一個非長型字段的列。)

建立分區數據庫
有了上述了解,就可以建一個分區數據庫了,示例如下:
1) 了解分區定義
     分區定義可以從節點配置文件(db2nodes.cfg)得到,其位於實例所有者的主目錄中,它包含一些配置信息,告訴 DB2 有哪些服務器參與分區數據庫環境的實例。分區數據庫環境中的每個實例都有一個 db2nodes.cfg 文件。對於每個參與實例的服務器,db2nodes.cfg 文件必須包含一個條目。當創建實例時,會自動創建 db2nodes.cfg 文件並對擁有實例的服務器添加條目。這里我們假設有4個分區。
2) 創建數據庫
create db dpfdb;
默認會創建3個分區組IBMCATGROUP(只在0號分區上)
IBMTEMPGROUP ,IBMDEFAULTGROUP(在所有分區上),如果用戶沒有創建其他分區組,所創建的表空間會默認放在IBMDEFAULTGROUP上
3) 創建分區組
   我們在 1到3號分區建立一個分區組
CREATE DATABASE PARTITION GROUP USERGROUP ON DBPARTITIONNUMS(1,2,3);
4) 創建表空間
CREATE TABLESPACE TS IN USERGROUP MANAGED BY DATABASE USING (file '/DB2containers/TScontainer $N' 10000)
有4個containers被創建
/DB2containers/TScontainer0 - on DATABASE PARTITION 0
/DB2containers/TScontainer1 - on DATABASE PARTITION 1
/DB2containers/TScontainer2 - on DATABASE PARTITION 2
/DB2containers/TScontainer3 - on DATABASE PARTITION 3
5) 創建表
CREATE TABLE DPFTABLE (ID INTEGER NOT NULL,
NAME CHAR(20) NOT NULL)
IN TS
PARTITIONING KEY (ID) USING HASHING;
如果想了解如何配置分區數據庫環境,請參考
http://www.ibm.com/developerworks/cn/aix/library/au-db2-dpf/index.html#N100A7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM