詳解人大金倉數(shù)據(jù)庫的垂直分區(qū)V3.0
1、概述
對一個大問題進(jìn)行劃分處理是計算機(jī)領(lǐng)域常見的手段。在數(shù)據(jù)庫應(yīng)用中,對于一個大表,既可以選擇進(jìn)行水平分區(qū),也可以選擇進(jìn)行垂直分區(qū)。水平分區(qū)在主流的數(shù)據(jù)庫產(chǎn)品中都得到了實現(xiàn),垂直分區(qū)一般要靠數(shù)據(jù)庫設(shè)計人員自行實現(xiàn)(將一個表劃分為多個表)。金倉數(shù)據(jù)庫V6在數(shù)據(jù)庫內(nèi)核中實現(xiàn)了表的垂直分區(qū),它可以簡化數(shù)據(jù)庫設(shè)計人員的工作,并為應(yīng)用程序提供透明的SQL訪問。
使用垂直分區(qū)主要利用了應(yīng)用對表中字段訪問的如下特性:
(1)字段訪問頻率的不均勻性:即某些字段訪問特別頻繁,其他字段則訪問的較少??梢詤⒖?0/20原則。
(2)應(yīng)用對字段訪問的聚集性:即應(yīng)用中的查詢傾向于一起訪問某些字段,如a、b、c三列總是一起訪問;d、e兩列總是一起訪問??梢詤⒖季植啃栽?。
(3)字段訪問順序的依賴性:即應(yīng)用中的查詢按照某個特定的順序訪問字段,例如訪問d、e字段前總是先訪問a、b、c字段。
在應(yīng)用對表的訪問滿足以上特性之一時,使用垂直分區(qū)可以使訪問/修改這些列的查詢不再需要訪問/修改其他無關(guān)列,從而減少物理I/O。
本文給出了一種根據(jù)“應(yīng)用的訪問模式”確定如何對表進(jìn)行垂直分區(qū)(即確定分區(qū)表中字段)的思路,并且以一個應(yīng)用為例。
2、金倉數(shù)據(jù)庫V6中垂直分區(qū)實現(xiàn)方法
金倉數(shù)據(jù)庫V6支持基于主碼連接的垂直分區(qū),語法如下:
- CREATE TABLE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] [SchemaName.]TableName
- (
- { ColumnName <DataType> [IDENTITY [(Seed, Increment)]]
- [ DEFAULT { NULL | USER | <Expression> } ] [ <ColumnConstraint> ]
- | [ <TableConstraint> ]
- } [, ...n ]
- ) [ <VerticalPartitions> ]
- [TABLESPACE TablespaceName]
- <VerticalPartitions> ::= PARTITION BY COLUMN
- ( [PartitionName]
- ({ ColumnName [, ...n ])
- [TABLESPACE TablespaceName] ) [, ...n ]
垂直分區(qū)是按列進(jìn)行分區(qū),即把一條記錄分開多個地方保存,每個分區(qū)的行數(shù)相同,列順序與PARTITION子句中的順序。
包括存放沒指定的列的分區(qū),分區(qū)數(shù)目必須大于等于二,各分區(qū)表間允許字段重復(fù),但不能完全重復(fù)。
垂直分區(qū)基表必須有主碼字段,如果分區(qū)沒有指定主碼字段,將在分區(qū)中加入基表中的主碼字段。
分區(qū)表不能有基表字段之外的字段,表中有但分區(qū)表沒指定的字段默認(rèn)放入一個新的分區(qū)表。
主碼字段和重復(fù)字段不能指定為IDENTITY。
如果沒有指定分區(qū)名,系統(tǒng)會自動建立分區(qū)名,分區(qū)的命名規(guī)則為基表名_VP_[1…N]。分區(qū)和基表在同一命名空間。
如果沒有指定表空間,缺省存放到分區(qū)基表所在的表空間中。
不支持建立跨分區(qū)的表級約束。
例子:
- CREATE TABLE base (
- col1 INT, col2 INT, col3 INT, col4 INT, col5 CHAR(100),
- PRIMARY KEY(col1, col2)
- )
- PARTITION BY COLUMN (P1(col1, col2, col3, col4), P2(col5));
將會創(chuàng)建名為BASE的基表和P1、P2兩個分區(qū)表。P1和P2的結(jié)構(gòu)如圖所示,兩個分區(qū)都包含元組控制信息(元組頭)、各分區(qū)的分區(qū)列和作為連接索引的主碼列col1和col2。
3、分區(qū)方案的選擇
在決定如何分區(qū)選擇時首先要了解應(yīng)用的場景,然后考慮分區(qū)對I/O的影響:
了解應(yīng)用場景(可以在應(yīng)用開發(fā)過程中進(jìn)行)
獲得應(yīng)用中包含的全部查詢;
記錄查詢的順序;
標(biāo)記查詢執(zhí)行的次數(shù)(或者是百分比);
記錄查詢平均訪問的元組數(shù);
看是否有滿足使用垂直分區(qū)的場景
將查詢按照涉及的表分組(涉及多個表的出現(xiàn)在多個組中);
對每一組查詢,做一個表格,表格的列是該組查詢涉及的表的列和列長度,表格的行是查詢;
對于該組每一個查詢,標(biāo)記該查詢涉及的列;
結(jié)合查詢的頻率和訪問元組數(shù)粗略查看是否有滿足使用垂直分區(qū)的場景;
計算I/O量獲得分區(qū)方法
在滿足場景的組中選擇幾個分區(qū)方案,包括分區(qū)的類型和列的組合。
根據(jù)分區(qū)類型計算各分區(qū)的元組I/O量。
注意盡可能考慮訪問模式,即查詢執(zhí)行順序帶來的物理I/O差別??赡軒淼牟顒e有:
1)去掉重復(fù)計算IO。例如一個涉及分區(qū)P1的查詢后會接著執(zhí)行一條更新該分區(qū)的語句,則更新語句的讀就不會是物理讀。
2)考慮命中率問題。不同分區(qū)的頁面命中率需要根據(jù)分區(qū)的訪問頻率進(jìn)行估計。
計算不分區(qū)方案和每個分區(qū)方案的I/O量,I/O量為查詢數(shù)*元組數(shù)*該分區(qū)元組I/O量。
比較選擇I/O量最小的方案。
驗證分區(qū)帶來的I/O減少
可能會有實際情況與計算不符的情況發(fā)生,因為計算中的I/O量是邏輯I/O量而不是準(zhǔn)確的物理I/O,實際測試每種方案,收集統(tǒng)計信息(每張表的讀寫信息、頁面的命中率),根據(jù)實際值調(diào)整方案。
4、實例:TPC-C的垂直分區(qū)選擇
TPC-C是一個典型的OLTP類型的負(fù)載。TPC-C測試中共有9張表,包括c_warehouse、c_customer、c_district、c_stock、c_order、c_order_line、c_item、c_history和c_new_order;另外,共有5種事務(wù)場景:new order、payment、order-status、delivery和stock-level,其中order-status和stock-level是純查詢事務(wù),其它是以更新為主的事務(wù)。
分析5種事務(wù)包含的查詢,除去c_warehouse、c_distric表等小表,以及更新較多的大表,如c_order和c_order_line,我們可以知道在c_stock表和c_customer表上進(jìn)行垂直劃分可以帶來較大效率的提升。我們可以根據(jù)實際待測試的環(huán)境,按照前面描述的原則進(jìn)行垂直劃分方案的設(shè)計、測試和驗證。