DB2分區數據庫淺析
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)的時間。
備份/恢復性能
將數據庫分區到不同的數據庫服務器上可以大大減少數據庫備份的時間,這也是是決定是否使用數據庫分區很重要的一點。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 | CREATE TABLE hash_tablename |
4、總結
此次分享旨在簡單介紹DB2分區的概念,並與Oracle的分區做比較。分區數據庫為提高查詢工作負載和 DML操作的性能提供了便利。 如果數據量較小,性能提升並不會很明顯,所以分區數據庫一般用在數據量較大,查詢需求較頻繁的數據庫。其實使用Oracle好還是DB2好並沒有絕對的選擇。例如Oracle采用完全開放策略,可以使客戶選擇最適合的解決方案,對開發商全力支持;DB2則最適於海量數據,並且在企業級的應用最為廣泛,可伸縮性及並行性強。就像廣東的老火湯很有味道,很滋補,中國人可能都喜歡喝,但是外國人覺得他們的羅宋湯那種很粘稠的才叫做湯,中國這種頂多叫Water!所以,自己需要的,才是最好的。
DB2分區數據庫淺析