標籤:資料庫 DB2
1、概念描述
DB2 資料庫分區是 DB2 企業版 DPF(Data Partitioning Feature)選件提供的,它主要用來個分區(邏輯的或物理的)上分布大型資料庫提供了必要的延展性,並利用了一個無共用(shared-nothing)結構。資料庫在一個非共用的環境中被分解為獨立的分區,每個分區都具有自己的資源,例如記憶體,CPU 和磁碟以及自己的資料、索引、設定檔和交易記錄。資料庫分區有時稱為節點或資料庫節點。通過 DPF“分治”的處理,延展性可在單一伺服器(縱向擴充)或跨伺服器叢集(橫向擴充)中獲得增強。
使用 DPF最顯而易見的理由之一就是提高查詢工作負載和 INSERT/UPDATE/DELETE 操作的效能。DPF 還可以克服部分 DB2 的架構限制。例如,在 DB2 中,對 4 KB 的頁面大小而言,表的最大大小是 64 GB;對於 8 KB 的頁面大小而言,表的最大大小是 128 GB;對於 16 KB 的頁面大小而言,表的最大大小是 256 GB;對於 32 KB 的頁面大小而言,表的最大大小是 512 GB。在 DB2 中,表和資料表空間的大小限制是根據每個分區進行規定的。跨多個分區劃分資料庫將允許您根據環境中分區數目的因數來增加表的最大大小。
DB2資料庫分區執行個體圖:
2、DPF對資料庫效能產生的影響
資料是通過Hash演算法均允地散列到不同的分區內的,每個分區只負責處理自己的資料。使用者發出 SQL 操作後,被串連的分區被稱為 Coordinate Node,它負責處理使用者的請求,並根據 Partition key(分區鍵)將使用者的請求分解成多個子任務交由不同分區平行處理,最後將不同分區的執行結果經過匯總返回給使用者,分區對應用來說是透明的。
在 DB2 中,資料庫分區可以部署在叢集或 MPP(多台單個CPU的機器上,建立的一個有多個partition的DB2執行個體,在其中的每台機器上建立1個Partition)環境下,也就是說資料庫分區分布在不同的機器上;資料庫分區也可以部署在同一台 SMP(一台有多個CPU的機器上,建立的一個有多個分區的DB2執行個體,其中分區數量不超過已有CPU的數量)機器上,在同一台機器上的分區我們稱為邏輯分區。同時,我們還可以在叢集或 MPP 環境下部署多個分區,在叢集或 MPP 每一個節點上部署多個邏輯分區。
採用資料庫分區有幾個好處,以下簡單介紹一下:
查詢擴充性
這是採用資料庫分區最主要的原因之一。將一個大的資料庫分成多個小的資料庫可以提高查詢的效能,因為每個資料庫分區擁有自己的一部分資料。假設現在掃描10萬條記錄,對一個單一分區的資料庫來講,該掃描操作需要資料庫管理員獨立掃描10萬條記錄,如果將資料庫系統做成10個分區,並將這10萬條記錄平均分配到這10個分區上,那麼每個資料庫分區的資料庫管理員只掃描10萬記錄。
架構限制
非分區資料庫的最大的表取決於頁面大小,4K頁最大支援64 GB,32K頁最大支援512 GB資料量。表和資料表空間大小限制是每個分區上的限制,因此將資料庫分成N個分區可以將表的最大尺寸增加為單個分區表最大尺寸的N倍。記憶體也可能是個限制,特別是在32位作業系統環境,因為每個資料庫分區管理並擁有自己的資源,因此通過資料庫分區可以克服這個限制。
資料庫裝載效能
資料庫分區可以並行裝載資料到所有資料庫分區,極大減少單表的裝載時間,這對於像即時商業智慧系統那樣對資料裝載的時間要求特別高的系統特別重要。
資料庫維護效能
將資料庫分散到多個資料庫分區伺服器可以加快系統維護,因為每個操作都運行在分區所管理的一個資料子集上面,這樣可以通過資料庫分區進一步減少建立索引的時間,減少搜集統計資訊的時間,因為runstats僅運行在一個資料庫分區上面,減少表重整(reorg)的時間。
備份/恢複效能
將資料庫分區到不同的資料庫伺服器上可以大大減少Database Backup的時間,這也是是決定是否使用資料庫分區很重要的一點。DB2 通過為每個資料表空間分配獨立的進程或線程來實現備份和恢複操作的平行處理。在分區資料庫環境的備份中,每個分區的備份是獨立的,通過並行備份資料庫分區可以大大減少備份整個資料庫的時間。
日誌
在高度活動的系統中,資料庫日誌的效能可能會限制系統的整體輸送量。在分區資料庫環境中,每個分區有自己一套日誌。當大量插入、更新、刪除操作時,多個資料庫分區可以提高效能,因為日誌是在每個資料庫分區上並行寫入,而且每個分區需要記錄的日誌更少。
DB2 隨資料量或處理器和分區的增加,可以提供近線性擴充能力,可是,資料庫分區是否提供最多的益處依賴於處理的工作負載、最大表的大小及其他因素。目前我們項目的資料倉儲也是使用資料庫分區,因為資料量較大,並且業務對CPU的需求也比較大,但是機器較老,單機無法增加更多CPU,並且一個執行個體上要實現多個分區,所以採用了另外一種SMP Cluster(多台有多個CPU的機器上,建立的一個有多個partition的DB2 Instance,在其中的每台機器上建立多個Partition)
3、DB2分區與Oracle的比較
| Oracle分區 |
DB2分區 |
Oracle 10g文法 |
DB2 V9文法 |
| 區間分區(Range Partitioning) |
表分區(Table Partitioning) |
PARTITION BY RANGE |
PARTITION BY RANGE |
| 雜湊分割(Hash Partitioning) |
資料庫分區(Database Partitioning) |
PARTITION BY HASH |
DISTRIBUTE BY HASH |
| 列表分區(List Partitioning) |
帶產生列表分區(Table Partitioning With Generated Column) |
PARTITION BY LIST |
PARTITION BY RANGE |
| 不支援 |
多維叢集(Multidimensional clustering) |
無 |
ORGANIZE BY DIMENSION |
以資料庫分區為例,以下是DB2的資料庫分區與Oracle雜湊分割特性的比較:
|
DB2分區 |
Oracle分區 |
分區架構 |
Share-nothing |
Share-disk |
分區特性 |
每個CPU都有私人記憶體地區和私人磁碟空間,並且兩個CPU不能訪問相同磁碟空間,CPU之間的通訊通過網路連接。 |
每個CPU使用自己的私人記憶體地區,通過內部通訊機制直接存取所有磁碟系統。 |
兩者區別 |
延展性 —— 隨著資料庫的增長可物理性的增加計算資源(也就是資料庫分區) |
無法通過增加物理的partition來給資料庫擴容 |
語句樣本 |
partition_tablename表選擇partition_ id欄位作為分區鍵 |
hash_tablename表按照hash_part欄位進行雜湊分割,每個分區以迴圈的方式放置在資料表空間tbsp1和tbsp2中。 |
CREATE TABLE partition_tablename (partition_id id NOT NULL, partition_id VARCHAR(20) NOT NULL) IN tbsp_parts DISTRIBUTE BY HASH (partition_id); |
CREATE TABLE hash_tablename (hash_part id, hash_id varchar2(20)) PARTITION BY HASH(hash_id) (partition p1 tablespace tbsp1, partition p2 tablespace tbsp2); |
4、總結
此次分享旨在簡單介紹DB2分區的概念,並與Oracle的分區做比較。分區資料庫為提高查詢工作負載和 DML操作的效能提供了便利。 如果資料量較小,效能提升並不會很明顯,所以分區資料庫一般用在資料量較大,查詢需求較頻繁的資料庫。其實使用Oracle好還是DB2好並沒有絕對的選擇。例如Oracle採用完全開放策略,可以使客戶選擇最適合的解決方案,對開發商全力支援;DB2則最適于海量資料,並且在企業級的應用最為廣泛,延展性及並行性強。就像廣東的老火湯很有味道,很滋補,中國人可能都喜歡喝,但是外國人覺得他們的羅宋湯那種很粘稠的才叫做湯,中國這種頂多叫Water!所以,自己需要的,才是最好的。
DB2分區資料庫淺析