DB2 9.5 數據庫分區管理及應用實踐
本文主要介紹什么是 DB2 數據庫分區,為什么采用數據庫分區,并以 Balanced Warehouse E7100 為例介紹數據庫分區管理的基本方法及應用實踐。
DB2 數據庫分區是 DB2 企業版 DPF(Data Partitioning Feature)選件提供的,它主要用來為大規模數據處理、高并發數據訪問提供支持。DB2 數據庫分區采用 Share-nothing 體系結構,數據庫在一個非共享的環境中被分解為獨立的分區,每個分區都具有自己的資源,例如內存,CPU 和磁盤以及自己的數據、索引、配置文件和事務日志。數據庫分區有時稱為節點或數據庫節點。如下圖所示:
圖 1. DB2 數據庫分區示例圖
數據通過 Hash 算法均允地散列到不同的分區內,每個分區只負責處理自己的數據。當用戶發出 SQL 操作后,被連接的分區被稱為 Coordinate Node,它負責處理用戶的請求,并根據 Partition key 將用戶的請求分解成多個子任務交由不同分區并行處理,最后將不同分區的執行結果經過匯總返回給用戶,分區對應用來說是透明的。
在 DB2 中,數據庫分區可以部署在集群或 MPP 環境下,也就是說數據庫分區分布在不同的機器上;數據庫分區也可以部署在同一臺 SMP 機器上,在同一臺機器上的分區我們稱為邏輯分區。同時,我們還可以在集群或 MPP 環境下部署多個分區,在集群或 MPP 每一個節點上部署多個邏輯分區。
DB2 數據庫分區提供了強大的可擴展能力。由于采用 Share-nothing 體系結構,每個分區(節點)只處理它那一部分數據,分區之間盡可能獨立,這就減少了節點間共享資源的爭用,允許數據庫有效地伸縮以支持更大的數據規模及更多的用戶訪問。DB2 數據庫分區提供 scale up (垂直擴展)及 scale out (水平擴展)能力。垂直擴展是通過增加機器的物理資源如 cpu、磁盤、內存來實現的;水平擴展是通過增加物理機器來實現的,DB2 中,最多可以支持 1000 個分區。在規劃 DB2 數據庫分區時,我們需要考慮是通過增加邏輯分區還是物理分區來實現擴展能力。如果一臺物理機器上有多個 CPU,其物理資源可以允許多個分區共享該資源,我們可以通過增加邏輯分區來實現擴展;如果一臺物理機器上的物理資源不能滿足應用需求,我們就需要通過增加機器,也就是物理分區來實現擴展能力。
DB2 數據庫分區還提供了強大的并行處理能力。首先,它提供了 inter-partition parallelism 分區間的并行機制,通過hash算法將數據庫請求分成多個任務在不同的分區上并行執行,同時,提供了 intra-partition parallelism 分區內的并行機制,將任務分解成不同的子任務,在不同的 CPU 上并行執行,另外,我們還可以同時利用 inter-partition parallelism、intra-partition parallelism 來實現完全的并行處理能力。DB2 數據庫的查詢操作、backup/restore/load 等實用程序及 I/O 操作都可以通過上述的并行處理能力來顯著提高其性能。如下圖所示:
圖 2. DB2 數據庫分區并行處理示例圖
為什么采用數據庫分區
采用數據庫分區,可以為您帶來如下好處:
查詢擴展性
這是采用數據庫分區最主要的原因之一。將一個大的數據庫分成多個小的數據庫可以提高查詢的性能,因為每個數據庫分區擁有自己的一小部分數據。假設您想掃描1億條記錄,對一個單一分區的數據庫來講,該掃描操作需要數據庫管理器獨立掃描一億條記錄,如果您將數據庫系統做成50個分區,并將這1億條記錄平均分配到這50個分區上,那么每個數據庫分區的數據庫管理器將只掃描200萬記錄。
架構限制
在DB2 V8和以前版本,非分區數據庫的最大的表取決于頁面大小,4K頁最大支持64 GB,32K頁最大支持512 GB數據量。表和表空間大小限制是每個分區上的限制,因此將數據庫分成N個分區可以將表的最大尺寸增加為單個分區表最大尺寸的N倍。內存也可能是個限制,特別是在32為操作系統環境,因為每個數據庫分區管理并擁有自己的資源,因此通過數據庫分區可以克服這個限制。
數據庫裝載性能
數據庫分區可以并行裝載數據到所有數據庫分區,極大減少單表的裝載時間,這對于像實時商業智能系統那樣對數據裝載的時間要求特別高的系統特別重要。
數據庫維護性能
將數據庫分散到多個數據庫分區服務器可以加快系統維護,因為每個操作都運行在分區所管理的一個數據子集上面,這樣可以通過數據庫分區進一步減少創建索引的時間,減少搜集統計信息的時間,因為runstats僅運行在一個數據庫分區上面,減少表重整(reorg)的時間。
備份/恢復性能
將數據庫分區到不同的數據庫服務器上可以大大減少數據庫備份的時間,這往往是決定是否使用數據庫分區很重要的一點。DB2 通過為每個表空間分配獨立的進程或線程來實現備份和恢復操作的并行處理的。在分區數據庫環境的備份中,每個分區的備份是獨立的,通過并行備份數據庫分區可以大大減少備份整個數據庫的時間。
日志
在高度活動的系統中,數據庫日志的性能可能會限制系統的整體吞吐量。在分區數據庫環境中,每個分區有自己一套日志。當大量插入、更新、刪除操作時,多個數據庫分區可以提高性能,因為日志是在每個數據庫分區上是并行寫的,且每個單一的分區需要記錄的日志更少。
DB2 隨數據量或處理器和分區的增加,提供近線性的擴展能力,可是,數據庫分區是否提供最多的益處依賴于處理的工作負荷、最大表的大小及其他因素。
什么時候采用數據庫分區
設計數據庫分區的基本原則是,盡量將大表分布在所有的分區上,提高并行處理能力;將小表放置在盡量少的分區上,一般是建議放在單一分區上;盡量減少分區間的通信。對于是否采用數據庫分區,除了考慮上一節提到的分區的優勢之外,我們也要根據分區設計原則來考慮:
選擇數據庫分區的一個比較理想的場景是執行一條像 ” select count(*) from big_table”這樣的語句。如果將這個表放在所有分區上,則每個分區都可以計算該表在其上的行數,并將這個局部總數(subtotal)發送到協調分區,以便計算總和,而這里的通信成本比起每個分區上所做的工作來可以忽略不計。
另一個非常合適的場景是, 一個大表與幾個非常小的很少更新的表相連接。大表是分區的,小表則被復制到每個分區上,這樣就可以并置連接。
不適合使用分區的是那些在連接時涉及很多大表和各種各樣的表和列的 ad hoc 查詢環境。在那些情況下, 很難或者不可能選擇表的分區鍵,使得所有大的查詢執行起來沒有很多的分區間通信。
同樣不適合使用分區的是那些有多條不能在單個分區內處理的非常小的語句。在這種情況下,分區間通信的開銷比起這些語句的本地執行來就相當高,而如果使用分區的話(尤其是跨多個物理系統),響應時間就會大大惡化。
大多數工作負載和一些特定的任務都處于剛才討論的這兩種極端之間,這些地方都需要通過原型來研究使用分區所帶來的影響。
#p#數據庫分區實現
下邊,我們以 IBM InfoSphere Balanced Warehouse E7100 為例,介紹一下DB2 分區數據庫在AIX下的基本管理方法及應用實踐。DB2 分區數據庫在 Windows 環境下的管理方法和 AIX 略有不同,具體請參閱相關手冊。
IBM InfoSphere Balanced Warehouse 是IBM針對客戶數據倉庫系統提出的一整套完整的解決方案。當用戶實施一個數據倉庫系統時,對用戶來說,一個非常大的挑戰就是未來的數據倉庫系統應該選擇什么樣的服務器,服務器的配置是什么,選擇多少臺服務器;選擇什么樣的存儲設備,存儲容量要多大,存儲設備配置是什么;選擇什么樣的網絡設備,它的配置是什么才能保證系統性能高效、穩定。同時,隨著系統的應用,數據量會急劇增長,如何在保證系統性能的前提下,提供更好的系統擴展能力也是用戶非常關心的問題。為了解決上述問題,IBM 結合自己多年實施客戶數據倉庫系統的經驗,并協同IBM軟件部門、服務器部門、存儲部門及實驗室,共同推出了 InfoSphere Balanced Warehouse 解決方案,有時也稱為 BCU(Balanced Configuration Unit)。InfoSphere Balanced Warehouse 是一個包含服務器、存儲、數據倉庫軟件在內的完整解決方案,它基于 IBM 最佳實踐并得到充分驗證,是一個預先配置好的、可立即使用的解決方案,客戶無需靠猜測或假象去配置并驗證,實現開箱即用。InfoSphere Balanced Warehouse 采用平衡的理念,每個組件(數據庫、服務器和存儲)提供均衡的性能確保整體方案性能最優。同時,它采用可擴展的模塊化設計,數據倉庫系統在整個生命周期中,可以以增量的方式進行擴展,達到的性能可預見、可度量。
InfoSphere Balanced Warehouse主要由以下幾個模塊組成:如下圖:
圖 3. InfoSphere Balanced Warehouse 模塊組成
Foundation Module: 有時也稱為 administration BCU。該模塊主要包括編目分區、協調分區以及單分區表。系統必須要有 1 個 Foundation Module。
Data Module: 有時也稱為 data BCU。該模塊主要保存分區表數據。根據數據量,可以有 1 個或多個 Data Module。
User Module: 如果系統有大量用戶訪問,我們可以考慮增加 User Module。
Failover Module: 用于滿足 HA 的需求。
Application Module: 用于運行應用程序,比如說 ETL 應用就可以配置在 Application Module 上。
本次配置環境包括一個 administration BCU 和 2 個 data BCU,如下圖所示:
圖 4. InfoSphere Balanced Warehouse 配置圖
創建實例及配置通信連接
使用db2icrt命令創建實例
/opt/IBM/db2/V9.1/instance/db2icrt -u bcufenc bcuaix |
配置TCPIP通信服務
db2set DB2COMM=tcpip |
修改DBM CFG 中的 SVCENAME參數
db2 update dbm config using svcename xbcuaix |
在實例級禁用fault monitor
db2fm -i instance_name -f no |
創建診斷文件目錄
缺省的情況下,db2diag.log 文件創建在 ~/sqllib/db2dump 目錄下,這個目錄是 NFS-mounted,我們一般建議要將 db2diag.log 文件放在非 NFS-mounted 目錄下。在 E7100 實施中,我們建議將該文件放到外部的存儲上。
Administration BCU:
mkdir -p /db2path/bcuaix/NODE0000/SQL00001/db2dump
Data BCU 1:
mkdir -p /db2path/bcuaix/NODE0001/SQL00001/db2dump
Data BCU 2:
mkdir -p /db2path/bcuaix/NODE0009/SQL00001/db2dump
Administration BCU:
ln -s /db2path/bcuaix/NODE0000/SQL00001/db2dump /db2path/bcuaix/db2dump
Data BCU 1:
ln -s /db2path/bcuaix/NODE0001/SQL00001/db2dump /db2path/bcuaix/db2dump
Data BCU 2:
ln -s /db2path/bcuaix/NODE0009/SQL00001/db2dump /db2path/bcuaix/db2dump
db2 update dbm config using diagpath /db2path/bcuaix/db2dump
定義數據庫分區
在數據庫分區環境下,數據庫被分為多個分區,分區之間彼此獨立工作,實現并行操作。數據庫分區可以是物理分區也可以是邏輯分區。在一臺物理機器上部署的一個分區,我們稱為物理分區,如果是在一臺 SMP 機器上部署多個分區,這些分區我們稱為邏輯分區。我們可以選擇物理分區,也可以選擇邏輯分區。通常,如果決定采用大的 SMP 機器,有更多的 CPU、內存及硬盤,我們會采用邏輯分區;如果決定采用多臺物理機器,我們會通過非共享的體系結構采用物理分區;如果決定采用多臺 SMP 機器,我們則會采用物理分區和邏輯分區結合的方式。
在 DB2 數據庫分區環境中,執行 CREATE DATABASE 語句所在的分區稱為編目分區(catalog partition)。編目分區保存系統編目表。編目分區只能創建在一個分區上。通常,在實際生產環境中,我們建議采用一個專用編目分區,這個分區只包含編目表,不包含用戶數據。這對 DB2 的一些實用程序運行效率有較大的提高。比如說 BACKUP 和 RESTORE 命令,需要先在編目分區上運行,之后才能在其他分區上執行。由于編目分區上沒有用戶數據,因此它的備份和恢復就可以很快完成,并且可以最小程度地延遲對其他分區的(并行)操作的開始。
在 DB2 數據庫分區環境中,應用程序連接的分區,我們稱為協調分區(coordinate partition)。它負責處理用戶的請求,并根據 Partition key 將用戶的請求分解成多個子任務交由不同分區并行處理,最后將不同分區的執行結果經過匯總返回給用戶。任何一個數據庫分區都可以是協調分區。在實際生產環境中,我們建議采用一個或幾個專用協調分區。因為應用程序要通過一個或多個協調分區為用戶連接轉移大量的數據的話,那么就會消耗那些分區上的大部分 CPU,并降慢了數據訪問速度。如果讓分區什么也不做,只是充當協調者(coordinator),就不會降低數據分區數據訪問速度。
在 InfoSphere Balanced Warehouse E7100 的設計中,我們在 administration BCU 中,分別為編目分區和協調分區分配了專用的分區,同時,根據數據庫分區的基本原則,我們將系統中的小表創建在了一個單一分區上。用戶的數據,我們創建在 data BCU 上,同時,根據數據庫分區的基本原則,我們將系統中的大表盡量地分布到 data BCU 上的所有分區上。當用戶數據增加后,我們可以通過增加更多的 data BCU 來實現增量的方式擴展、提供均衡的性能。如下說明:
Database partition 0 (BPU 0) 包含:
Catalog function (only one database partition has the database catalog)
Coordinator function
Single-partition data function
Query Patroller server and control tables (if implemented)
Located on the administration BCU
Database partition 1 - n (BPU1 - BPUn) 包含:
Database partitions with partitioned data
Located on the data BCUs
DB2 節點配置文件(db2nodes.cfg)
用來定義數據庫分區。在創建分區數據庫之前,一定要先定義 db2nodes.cfg 文件。該文件放置在用戶實例主目錄下。系統中的每一個分區在該文件中都會有一項。
db2nodes.cfg 文件的基本格式如下:
dbpartitionnum hostname logical-port netnam |
其中:
dbpartitionnum
數據庫分區號唯一地定義數據庫分區,可在 0 到 999 之間。數據庫分區號必須以升序順序排序。該順序中可以有間隔。一旦指定了數據庫分區號,就不能對其進行更改。否則,分布圖(它指定數據分發方式)中的信息可能不正確。
hostname
用作分區間通信的 IP 地址的主機名。
logical-port
它指定該數據庫分區的邏輯端口號。此號碼與數據庫管理器實例名一起用來標識 etc/services 文件中的 TCP/IP 服務名稱條目。 對于每個主機名,一個邏輯端口必須為 0(零) 。
netname
指定用于 FCM 高速互聯的主機名稱 。
下邊是包括一個 administration BCU 和 2 個 data BCU 環境的 db2nodes.cfg 文件內容:
0 adminbcu001 0 adminbcu001_fcm
1 databcu001 0 databcu001_fcm
2 databcu001 1 databcu001_fcm
3 databcu001 2 databcu001_fcm
4 databcu001 3 databcu001_fcm
5 databcu001 4 databcu001_fcm
6 databcu001 5 databcu001_fcm
7 databcu001 6 databcu001_fcm
8 databcu001 7 databcu001_fcm
9 databcu002 0 databcu002_fcm
10 databcu002 1 databcu002_fcm
11 databcu002 2 databcu002_fcm
12 databcu002 3 databcu002_fcm
13 databcu002 4 databcu002_fcm
14 databcu002 5 databcu002_fcm
15 databcu002 6 databcu002_fcm
16 databcu002 7 databcu002_fcm
在分區號的分配上,我們建議,catalog partition 分區號分配為 0,因為一個實例下只能有 1 個 catalog partition,分區號 990-999 分配給另外需要增加的 coordinator partitions,分區號 980-989 分配給另外需要增加的單分區的表。
配置分區間通信
在 DB2 數據庫分區環境中,分區之間需要通過 DB2 Fast Communication
Manager 進行通信。在 /etc/services 文件中,需要為 DB2 FCM 通信設置相應的通信端口。
xbcuaix 50000/tcp xbcuaix_int 50001/tcp DB2_bcuaix 60000/tcp DB2_bcuaix_END 60016/tcp |
創建數據庫
我們在 administration BCU 上創建數據庫testdb。
db2 "create database testdb automatic storage no on /db2path \ pagesize 16384 autoconfigure apply none" |
創建數據庫分區組(database partition groups)
數據庫分區組是一個或多個數據庫分區的集合。在 DB2 數據庫分區環境中,數據庫表空間創建在數據庫分區組中。
在設計數據庫分區組時,我們一般建議:
幾乎總要為小的表創建至少一個單分區的數據庫分區組。
幾乎總要為大的表使用至少一個由所有分區組成的數據庫分區組。這個數據庫分區組可以是缺省的 IBMDEFAULTGROUP。
分區數越多,就越可能存在一些對單分區來說太大、而要展開到所有分區上又太小的表,那么就越需要創建包含數個分區、但不是全部分區的數據庫分區組。
當我們創建一個數據庫后,系統會缺省創建 3 個數據庫分區組:
IBMCATGROUP:編目數據庫分區組,用來存儲系統編目表。它只包含一個數據庫分區。
SYSCATSPACE 表空間創建在這個分區組中。
在 BCU 設計中,IBMCATGROUP 創建在 0 號數據庫分區上。
IBMTEMPGROUP.:臨時數據庫分區組,tempspace1 系統臨時表空間創建在這個分區組中。它包含系統中的所有數據庫分區。
IBMDEFAULTGROUP:缺省數據庫分區組。用戶表空間缺省創建在該分區組中。USERSPACE1 表空間包含在 IBMDEFAULTGROUP 中。
在BCU設計中,建議不使用IBMDEFAULTGROUP,而是創建了2個新的數據庫分區組:
PDPG: 分布在data BCU分區上的數據包含在此數據庫分區組中。PDPG 只包括data BCU 上的分區,但不包含administration BCU上的分區。它適用于中等數據規模到大數據規模的表。
SDPG:該數據庫分區只包含 administration BCU 分區上的數據,它只包含一個數據庫分區,即 0 號數據庫分區。系統中的一些小表保存在此數據庫分區組中,這些小表通常是一些維表(dimension tables)或 lookup tables。
CREATE DATABASE PARTITION GROUP PDPG ON DBPARTITIONNUMS (1 to 16) CREATE DATABASE PARTITION GROUP SDPG ON DBPARTITIONNUMS (0) |
創建 buffer pools
在本示例中,我們創建 2 個 16K 頁的 buffer pools:
CREATE BUFFERPOOL BP_16K ALL DBPARTITIONNUMS SIZE 53760 PAGESIZE 16K; CREATE BUFFERPOOL BPTMP_16K ALL DBPARTITIONNUMS SIZE 10752 PAGESIZE 16K; |
創建表空間
在本次實例中,我們將創建如下表空間:
db2tmp ---臨時表空間
ts_pd_data_001---分區表數據空間
ts_pd_idx_001---索引表空間
ts_sd_small---單分區表空間。如圖所示:
圖 5. 表空間創建示例圖:
在 data BCU 上創建如下表空間:
CREATE TEMPORARY TABLESPACE db2tmp
IN DATABASE PARTITION GROUP ibmtempgroup
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/db2tmp’ 25G)
ON DBPARTITIONNUMS (0)
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs2p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs3p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs4p $N /bcuaix/databasename/db2tmp’ 25G)
ON DBPARTITIONNUMS (1 to 16)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BPTMP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 400G
NO FILE SYSTEM CACHING;
CREATE TABLESPACE ts_pd_data_001
IN DATABASE PARTITION GROUP pdpg
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs2p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs3p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs4p $N /bcuaix/databasename/ts_pd_data_001’ 50G)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 400G
NO FILE SYSTEM CACHING;
CREATE TABLESPACE ts_pd_idx_001
IN DATABASE PARTITION GROUP pdpg
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2fs2p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2f3p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2fs4p $N /bcuaix/databasename/ts_pd_idx_001’ 25G)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 200G
NO FILE SYSTEM CACHING;
在administration BCU上創建如下表空間:
CREATE TABLESPACE ts_sd_small_001 |
在創建分區數據庫表空間時,我們經常會使用數據庫分區表達式。它是由參數 ' $N (注意在 $N 之前有一個空格)來指定的,DB2 會將 $N 替換成數據庫分區組中已定義的分區號。
創建表
當創建數據庫分區組時,每一個數據庫分區組都會對應一個分區圖(partitioning map),它是一個包含 4096 個條目的數組,每個條目的值對應于數據庫分區組中的某一個分區號。
分區鍵(partitioning key)是由一個表上的一個列或者多個列組成,用于確定某一行特定數據分布在哪個分區上。分區鍵是在 CREATE TABLE 語句來定義的。如果沒有指定分區鍵,缺省的分區鍵是主鍵的第一列,如果沒有這么一列,則選擇有適合數據類型的第一列。
當向表中插入一條記錄時,DB2 將該記錄的分區鍵值散列(hash)到分區圖中的一個條目上,并根據該條目找到要使用的分區號。
在定義分區表時,分區鍵的定義對今后性能的影響非常大,因此,在選擇上一定要慎重。通常,在選擇分區鍵時,要遵從如下原則:
選擇經常用于連接的列作為分區鍵。
分區鍵應該不包括經常更新的列。
除非一個表不是很重要,或者不知道一個好的分區鍵選擇是什么,否則不應該隨缺省情況選擇分區鍵。缺省的分區鍵是主鍵的第一列,如果沒有這么一列,則選擇有適合數據類型的第一列。
將一個表創建為分區表之后,就不能直接更改它的分區鍵。
通過 ALTER TABLE 可以添加或刪除分區鍵,但是這只對未分區表有效。
那些處于表上定義的惟一性約束或主鍵約束中的列必須是分區鍵的一個超集(superset)
數據類型:LOB 和 LONG 型的列不能作為分區鍵的一部分
就效率而言,整數類型的列是最可取的,其次是字符型,然后是小數。
選擇基數較大的分區鍵列,以避免表中的行在各分區上分布不均衡。
在 DB2 數據庫分區環境下,數據在不同分區的分布會影響表的連接策略。分區數據庫環境下表連接策略主要包括:
并置連接(Collocated joins)--采用該種連接方式,表的連接以本地方式在數據所在的數據庫分區上進行,不會在分區之間傳輸數據,這是效率最高的表連接方式。在分區數據環境下,應盡量采用該種連接方式。
定向連接(Directed joins)--采用該種連接方式,一個表中的數據會按照連接對中的另一個表的分區鍵值重新分發到其他分區上來完成表連接操作。它會在分區之間移動數據,對性能會有一定影響。當并置連接及未被采用,DB2優化器會選擇定向連接方式。
廣播連接( Broadcast joins)--采用該種連接方式,一個表中的所有數據會廣播到另外表所在的所有分區上來完成表連接操作。如果在分區之間廣播的數據量較大,對性能影響也會很大。當并置連接及定向表連接未被采用,DB2 優化器會選擇廣播連接方式。
在 DB2 數據庫分區環境下,應盡量采用并置連接方式。要使用并置連接方式,被并置的表必須:
在相同的數據庫分區組內
分區鍵必須有相同數量的列。
分區鍵中相應的列必須是分區兼容的。
分區兼容性是在分區鍵中相應列的基本數據類型之間定義的。分區兼容的(partition-compatible)數據類型有一個特性,那就是對于兩種不同類型的兩個變量,假設變量有相同的值,則它們將通過相同的分區函數映射到相同的分區鍵索引。分區兼容性有以下特征:
內部格式用于 DATE、TIME 和 TIMESTAMP。這些類型彼此不兼容,并且沒有哪一個與 CHAR 或 VARCHAR 兼容。
分區兼容性不受具有 NOT NULL 或 FOR BIT DATA 定義的列的影響。
對于兼容數據類型的 NULL 值是一致處理的。而不兼容數據類型的 NULL 值可能產生不同的結果。
可以使用 UDT 的基本數據類型來分析分區兼容性。
分區鍵中具有相同值的小數是一致處理的,即使它們的標度(scale)和精度(precision)不一樣也是如此。
系統提供的散列函數將忽略字符串(CHAR、VARCHAR、GRAPHIC 或 VARGRAPHIC)的結尾空白。
不同長度的 CHAR 或 VARCHAR 是兼容的數據類型。
相等的 REAL 或 DOUBLE 值,即使它們的精度不同,也將被一致處理。
另外,我們也經常使用復制的具體化查詢表(replicated MQT)來實現并置連接。我們往往會選擇更新不多而又經常與大表進行連接的小表或中等大小的表來作為復制的具體化查詢表。
下面是對復制表的一個示例定義:
create table t1_rep as (select * from t1) data initially deferred \ refresh deferred in ts_pd_data_001 replicated |
下邊的例子,我們在 ts_pd_data_001 表空間上創建一個 LINEITEM 表:
CREATE TABLE "DB2INST1"."LINEITEM" (
"L_ORDERKEY" INTEGER NOT NULL ,
"L_PARTKEY" INTEGER NOT NULL ,
"L_SUPPKEY" INTEGER NOT NULL ,
"L_LINENUMBER" INTEGER NOT NULL ,
"L_QUANTITY" DECIMAL(15,2) NOT NULL ,
"L_EXTENDEDPRICE" DECIMAL(15,2) NOT NULL ,
"L_DISCOUNT" DECIMAL(15,2) NOT NULL ,
"L_TAX" DECIMAL(15,2) NOT NULL ,
"L_RETURNFLAG" CHAR(1) NOT NULL ,
"L_LINESTATUS" CHAR(1) NOT NULL ,
"L_SHIPDATE" DATE NOT NULL ,
"L_COMMITDATE" DATE NOT NULL ,
"L_RECEIPTDATE" DATE NOT NULL ,
"L_SHIPINSTRUCT" CHAR(25) NOT NULL ,
"L_SHIPMODE" CHAR(10) NOT NULL ,
"L_COMMENT" VARCHAR(44) NOT NULL )
DISTRIBUTE BY HASH("L_ORDERKEY")
IN " ts_pd_data_001"
#p#
數據庫分區管理相關命令
確定編目分區
在 DB2 數據庫分區環境中, ROLLFORWARD DATABASE 等命令需要在編目分區上執行。我們可以通過 LIST DATABASE DIRECTORY 命令來確定編目分區。
db2 LIST DATABASE DIRECTORY |
分區切換
在 DB2 數據庫分區環境中,我們可以通過設置 DB2NODE 環境變量 或使用 set client 命令進行分區間的切換。
export DB2NODE=2 |
增加數據庫分區
該命令會自動在 db2nodes.cfg 中增加新定義的分區信息,并在新的數據庫分區上創建
TEMPSPACE1 表空間。
我們也可以用如下命令增加數據庫分區:
export DB2NODE=4 |
使用該命令時,必須事先修改 db2nodes.cfg 文件包含新定義的分區信息,并在新增加的數據庫分區上執行該命令。
刪除數據庫分區
在刪除數據庫分區時,只有那些不包含數據的分區才可以被刪除。因此,在刪除分區時,必須要先執行 DROP PARTITIONNUM VERIFY 命令檢查一下該分區是否可以被刪除。如果某一個分區正在被使用,要先執行 REDISTRIBUTE DATABASE PARTITION GROUP 命令將該分區上的數據分布到其他分區上。
export DB2NODE=4 |
如果數據庫分區 4 上有數據,則執行下述命令:
redistribute database partition group pg123 uniform drop dbpartitionnum (4) |
查看數據庫分區組
db2 LIST DATABASE PARTITION GROUPS SHOW DETAIL |
重新分布數據庫分區組數據
db2 "REDISTRIBUTE DATABASE PARTITION GROUP pg123 UNIFORM" |
增加數據庫分區到數據庫分區組中
db2 "ALTER DATABASE PARTITION GROUP pg123 ADD DBPARTITIONNUMS (4) WITHOUT TABLESPACES" |
從數據庫分區組中刪除數據庫分區
db2 drop dbpartitionnum verify |
刪除數據庫分區組
db2 "DROP DATABASE PARTITION GROUP pg123" |
查看表中的數據在各分區的分布情況
SELECT DBPARTITIONNUM(distribution key), COUNT( * ) |
查看表中的數據在分區圖(partition map)中的分布情況
SELECT HASHEDVALUE(distribution key), COUNT( * ) |
DB2 分區數據庫相關實用程序
db2_all 命令
在 DB2 分區環境下,很多操作都需要在各個分區上分別執行,如果每次都要到各個分區上單獨執行,對用戶來說非常繁瑣。在 DB2 中,可以使用 db2_all 命令,它可以在指定的所有數據庫分區服務器上運行該命令。
db2_all "db2 UPDATE DB CFG FOR TESTDB USING LOGRETAIN ON" |
rah 命令
它指定在所有計算機上運行該命令。
如果想為多臺物理機器創建一個目錄,那么可以發出下面的命令
rah ")mkdir /tmp/$USER“ |
數據庫備份
要備份分區數據庫,您必須要首先在編目分區上調用備份實用程序,然后在其他數據庫分區上調用備份實用程序。
db2_all "<<+0< db2 BACKUP DB testdb to /home/db2inst1/BACKUPS" |
其中,“+0”表示只在 0 號分區上執行,“-0”表示在除了 0 號分區之外的所有分區上執行。
在版本 9.5 之前,您必須一次一個數據庫分區地備份分區數據庫。一次一個數據庫分區地備份多個數據庫分區可能會出錯并且費時。如果一次一個數據庫分區地備份分區數據庫,那么您無法在備份映像中包括復原和恢復所需要的日志文件。在版本 9.5 中,您可以通過在 b 編目數據庫分區上執行單一系統視圖(SSV)備份同時備份多個數據庫分區。您從編目數據庫分區執行備份操作時,可以使用 ON DBPARTITIONNUMS 選項來指定要在備份中包含哪些分區。它將同時備份指定的分區,并且與指定的分區相關聯的備份時間戳記將相同。此外,您還可以在 SSV 備份中包含數據庫日志。
db2 BACKUP DATABASE testdb ON DBPARTITIONNUMS (1, 2) \ |
監控數據庫備份命令執行情況
export DB2NODE=0 |
數據庫恢復
要恢復分區數據庫,您必須要首先在編目分區上調用恢復實用程序,然后在其他數據庫分區上調用恢復實用程序。
db2_all "<<+0< db2 RESTORE DATABASE testdb \ |
前滾恢復(ROLLFORWARD DATABASE)
在分區數據庫中,ROLLFORWARD DATABASE 命令只能在編目分區上運行。如果需要前滾恢復數據庫或表空間到某一時間點(point in time ),則該命令會涉及到db2nodes.cfg 文件中定義的所有數據庫分區上的數據。如果需要根據整個事務日志(to the end of logs)來前滾恢復數據庫或表空間, 則該命令會涉及到所有指定的數據庫分區上的數據。如果沒有指定數據庫分區,該命令會涉及到db2nodes.cfg 文件中定義的所有數據庫分區上的數據。如果某一分區不需要執行前滾恢復,則該分區會被忽略掉。
當數據庫處于一致狀態時(當數據庫目錄中列示的對象與磁盤中實際存在的對象匹配時),最小恢復時間是前滾期間的最早時間點。手動確定要將數據庫前滾至的正確時間點比較困難,尤其是對于分區數據庫更是如此。在版本 9.5 中,通過在 ROLLFORWARD DATABASE 命令中使用 TO END OF BACKUP 參數,可以將數據庫前滾至由數據庫管理器確定的最小恢復時間。
前滾恢復分區 0 及分區 2 上的表空間TBS1:
db2 rollforward db testdb to end of logs on dbpartitionnums (0, 2) tablespace(TBS1) |
前滾恢復分區 6 上的 6 個小表:
db2 rollforward database testdb to end of logs on dbpartitionnum (6) \ |
前滾至由數據庫管理器確定的最小恢復時間:
db2 rollforward db testdb to end of backup and complete |
EXPORT 命令
export 用于將表中的數據卸載到文件中。
db2 "EXPORT TO lineitem.del OF DEL SELECT * FROM db2inst1.lineitem" |
在分區數據庫環境下,import 或 LOAD 命令不支持 IFX 文件格式。
IMPORT 命令
用于將外部文件中的數據插入到表中。
db2 "IMPORT FROM lineitem.tbl OF DEL MODIFIED BY COLDEL| \ |
LOAD 命令
在多分區數據庫環境中,大量的數據放在多個數據庫分區中。分區鍵用來確定每部分數據所在的數據庫分區。必須先分布數據,然后才能將該數據裝入到正確的數據庫分區中。
在多分區數據庫中裝入表時,load 實用程序可以:
并行地分布輸入數據
同時在各個相應數據庫分區中裝入數據
將數據裝入到多分區數據庫中分兩階段完成:第一階段為設置階段,在此階段獲取數據庫分區資源(如表鎖定);第二階段為裝入階段,在此階段將數據裝入到數據庫分區中。在將數據裝入多分區數據庫時,可以使用下列其中一種方式:
PARTITION_AND_LOAD
對數據進行分布(有可能以并行方式進行分布),并且同時在各個相應數據庫分區上裝入數據。
PARTITION_ONLY
對數據進行分布(有可能以并行方式進行分布),并將輸出寫入每個裝入數據庫分區上指定位置中的文件。每個文件都包含分區頭,該分區頭指定數據在數據庫分區上的分布方式,并指定可以使用 LOAD_ONLY 方式將該文件裝入到數據庫中。
LOAD_ONLY
假定數據已分布在數據庫分區上;將跳過分布過程,并且在相應的數據庫分區上同時裝入數據。
ANALYZE
生成最佳分布圖(在所有數據庫分區之間均勻地分布數據)。
下邊是 LOAD 命令的一些示例:
要將 load.del 中的數據裝入到所有定義了 TABLE1 的數據庫分區中,請發出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 |
要在數據分布在數據庫分區 3 和數據庫分區 4 上的位置執行裝入操作,請發出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB \ |
在使用數據庫分區 3 和數據庫分區 4 的情況下,要將 load.del 分布(而不裝入)到所有定義 TABLE1 的數據庫分區中,請發出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB |
如果已經以 PARTITION_ONLY 方式執行了裝入操作,并且要將每個裝入數據庫分區的 /db2/data 目錄中的分區文件裝入到所有定義了 TABLE1 的數據庫分區中,請發出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
要僅裝入到數據庫分區 4 中,請發出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
REORG 命令
在分區數據庫中,同樣使用DB2 REORG 命令重組表及索引。
db2 "REORG INDEXES ALL FOR TABLE lineitem ALLOW WRITE ACCESS" |
RUNSTATS 命令
在分區數據庫中,同樣使用RUNSTATS命令收集統計信息。
db2 "RUNSTATS ON TABLE db2inst1.lineitem WITH DISTRIBUTION AND \ |
在分區數據庫中,RUNSTATS 命令運行時所在分區的統計信息才會被收集,再對這些統計信息加以推斷(前提是行在各分區上是均勻分布的)以反映整個數據庫。這意味著,SYSCAT.TABLES 中的 CARD 列可能不包含該表中確切的行數。我們要盡量讓數據均勻地分布在各分區上。
結論
本文以 Balanced Warehouse E7100 為例,為大家介紹了數據庫分區設計、實現及管理的基本方法。希望大家能夠對 DB2 數據庫分區技術及使用有一個比較全面的了解。另外,關于數據庫分區監控及性能調優等方面內容,大家可以參考 DB2 信息中心相關內容。
db2start DBPARTITIONNUM 4 ADD DBPARTITIONNUM HOSTNAME Clyde PORT 4 |
【編輯推薦】