正確認識DB2數(shù)據(jù)庫分區(qū)兼容性和并置概念
最近在看一些DB2的DPF方面的東西,有兩個概念有一些搞不懂。
就是“分區(qū)兼容性”和“并置”兩個概念。
查找了一些相關(guān)資料,內(nèi)容如下:
分區(qū)兼容性
可對分區(qū)鍵的對應(yīng)列的基本數(shù)據(jù)類型進行比較,并可將它們聲明為是分區(qū)兼容的(partition compatible)。分區(qū)兼容的數(shù)據(jù)類型具有如下屬性:具有相同值但有不同類型的兩個變量會按相同的分區(qū)算法映射至同一個分區(qū)號。 分區(qū)兼容性具有下列特征:
基本數(shù)據(jù)類型與另一個相同的基本數(shù)據(jù)類型兼容。
內(nèi)部格式用于 DATE、TIME 和 TIMESTAMP 數(shù)據(jù)類型。它們彼此都不兼容,且都不與 CHAR 兼容。
分區(qū)兼容性不受帶有 NOT NULL 或 FOR BIT DATA 定義的列的影響。
對兼容數(shù)據(jù)類型的 NULL 值的處理是完全相同的;對不兼容數(shù)據(jù)類型的 NULL 值的處理可能不相同。
用戶定義的類型的基本數(shù)據(jù)類型用于分析分區(qū)兼容性。
對分區(qū)鍵中相同值的小數(shù)的處理是完全相同的,即使它們的標度和精度不同。
字符串中(CHAR、VARCHAR GRAPHIC 或 VARGRAPHIC)的尾部空格會被散列算法忽略。
BIGINT、SMALLINT 和 INTEGER 是兼容的數(shù)據(jù)類型。
REAL 和 FLOAT 是兼容的數(shù)據(jù)類型。
不同長度的 CHAR 和 VARCHAR 是兼容的數(shù)據(jù)類型。
GRAPHIC 和 VARGRAPHIC 是兼容的數(shù)據(jù)類型。
分區(qū)兼容性不適用于 LONG VARCHAR、LONG VARGRAPHIC、CLOB、DBCLOB 和 BLOB 數(shù)據(jù)類型,因為它們不能作為分區(qū)鍵。
并置
并置(collocation)是安置同一個數(shù)據(jù)庫分區(qū)中包含相關(guān)數(shù)據(jù)的不同表中的行。并置的表使 DB2 可以更有效地使用連接策略。
您可能會發(fā)現(xiàn),作為對特定查詢的響應(yīng),兩個或多個表頻繁地提供數(shù)據(jù)。在此情況下,您會希望這樣的表中的相關(guān)數(shù)據(jù)的位置盡可能地靠近。在數(shù)據(jù)庫被物理地劃分為兩個或多個數(shù)據(jù)庫分區(qū)的環(huán)境中,必須有一種方法可將劃分的表的相關(guān)碎片盡可能地靠近。完成此過程的功能稱為表并置。
當存取用于連接或子查詢的多個表時,DB2(R) 通用數(shù)據(jù)庫(DB2 UDB)能夠識別要連接的數(shù)據(jù)是否位于相同數(shù)據(jù)庫分區(qū)上。于是 DB2 就可以在存儲數(shù)據(jù)的數(shù)據(jù)庫分區(qū)上執(zhí)行連接或子查詢,而不必在數(shù)據(jù)庫分區(qū)之間移動數(shù)據(jù)。這種局部地執(zhí)行連接或子查詢的能力具有顯著的性能優(yōu)點。
要發(fā)生并置,表必須:
在相同數(shù)據(jù)庫分區(qū)組中,且這個數(shù)據(jù)庫分區(qū)組不能處在再分配期間。(在再分配期間,數(shù)據(jù)庫分區(qū)組中的表可能使用不同的分區(qū)映射 —— 它們不是并置的。)
有包含相同數(shù)量的列的分區(qū)鍵。
分區(qū)鍵的相應(yīng)列是分區(qū)兼容的。
如果一個表在一個單分區(qū)數(shù)據(jù)庫分區(qū)組中,且該分區(qū)組是在另一個表所在的同一個分區(qū)上定義的,那么也可以發(fā)生并置。
總結(jié):
比如int, char, varchar之類能夠被散列的數(shù)據(jù)類型就是分區(qū)兼容性得,其他類似LOB, LF等類型不能被散列的就不是
對于并置,比如我有兩個表A,B,其中A包含列c1 int, c2 char,B包含c1 varchar, c2 int
然后表A按照c1分區(qū),表B按照c2分區(qū),也就是說,當用戶插入一行數(shù)據(jù)到表A,首先會對A.c1進行散列,然后模分區(qū)數(shù)量,把新的數(shù)據(jù)插入相應(yīng)的分區(qū),而對于表B則是對B.c2進行相同算法散列。
這樣當查詢select * from c1,c2 where A.c1=B.c2的時候,由于A.c1和B.c2的數(shù)據(jù)類型相同,使用相同的散列算法,如果A.c1與B.c2相等,那么他們肯定在同一分區(qū),這樣的話進行join的時候就不需要再分區(qū)間移動數(shù)據(jù),只需要在本分區(qū)join完后向coord partition返回數(shù)據(jù)。
