二維表一樣是GP中重要的存儲數據對象,爲了更好的支持數據倉庫海量數據的訪問,GP的表能夠分紅:算法
固然AOT表也能夠是按行存儲的,可是按列存儲必須是AOT表。這樣,咱們在設計應用上能夠得到至關的靈活性。好比常常須要更新的數據,或者較小的維度數據,應該使用普通堆積表存儲。數據庫
例子:安全
create table tmp_001( month_id numeric(8), serv_id numeric(30), cust_id numeric(30) ) with ( appendonly=true, compresslevel=5, orientation=column, compresstype=zlib, oids=false ) distributed by (month_id,serv_id)
1.分佈鍵(哈希鍵)併發
注意:app
2.AOT 指定按列分佈dom
3.其餘注意性能
與其它數據庫相比,GP的表最大的不一樣是它必定是分區的,也就是表中的全部記錄都會依據相關算法打散,分佈到全部的segment當中,從而在充分利用硬件資源的同時,最大化訪問數據的IO,這種特性對於數據倉庫應用是很是有幫助的。ui
GP提供兩種打散數據的算法,一種是Hash算法:distributed by (serv_id),在定義表的時候,經過distributed by指定表中的某個列或者某個列的組合做爲Hash鍵,相同Hash鍵的記錄會放在同一個segment當中。因此,GP建議通常選擇記錄分佈均勻的鍵做爲Hash鍵使用,從而保證表中的記錄能夠均勻分佈到全部segment上。若是表上定義了主鍵或者惟一鍵,則這些鍵值列必須做前導列出如今分佈鍵當中,而且放在第一位。spa
若是定義表的時候,沒有指定distributed子句,系統使用第一個列做爲Hash鍵使用。設計
另外一種數據打散的算法是平均分配法(ROUND-ROBIN),distributed randomly, 假設有三個段,那麼這種算法會把第一條記錄放在段1, 第二條記錄放在段2,第三條記錄放在段3,第四條記錄放在段1,以此類推,直到全部記錄發放完爲止。這種算法比較適合表中的字段存在嚴重數據傾斜的狀況。
在數據倉庫中,對於存儲海量少變化歷史數據的事實表的訪問,會產生大量IO。這些表除了記錄多外(縱向),同時也很寬。好比幾十列,甚至上百列的表也很常見。可是在進行數據分析和挖掘過程當中,咱們可能只用到這些列的很小一部份內容,而傳統的按行存儲的表,在訪問時老是會訪問記錄中的全部列,致使不少無效IO,當因爲表橫向尺寸過大,按行存儲的表還會出現行連接,這會使無效IO的問題更嚴重。在GP中,對於這種狀況應該考慮使用面向列存儲的AOT表,從而大幅高IO效率,獲取數據查詢性能的收益。
如今硬件系統每每IO效率跟不上CPU處理的速度,而數據倉庫應用偏偏是IO敏感型的應用,因此不少數據倉庫系統上,會看到CPU很閒,可是出現大量IO等待的狀況。因此經過壓縮,尤爲是面向列壓縮,容許咱們犧牲必定的CPU效率進一步換取IO效率,提升系統的的吞吐量。
GP的AOT表容許使用兩種壓縮算法,一種是ZLIB,它的壓縮率較高,對CPU的消耗較多,GP中能夠指定1到9共9個級別。1的壓縮比最小,9最大。另外一種算法是QUICKLZ,它的壓縮比小,能設置1,形成的CPU負載也比ZLIB小。
AOT表雖然查詢和加載數據的效率很高,可是如它的名字那樣它只能支持select,insert,truncate操做,不支持update和delete操做。因此它只適合存放通過處理基本最終無變化的歷史數據,用來提供高效的查詢訪問。
從數據數據存放的生命週期看,前面介紹的表都稱之爲永久表,這些表的記錄不會由於事務的結束和會話的斷開而消失。而業務中,咱們常常要使用到臨時數據集合,若是用永久表存放中間結果,一方面是在併發環境中數據不安全,另外一方面頻繁的刪除表中的記錄或者刪除表,會致使大量碎片,在字典層面形成瓶頸。所以GP也支持臨時表,不一樣鏈接共享相同的表結構。好比下面的例子:
CREATE TEMP TABLE SALES_TMP (PROD_ID numeric NOT NULL , CUST_ID numeric NOT NULL , TIME_ID DATE NOT NULL , CHANNEL_ID numeric NOT NULL , PROMO_ID numeric NOT NULL , QUANTITY_SOLD numeric(10,2) NOT NULL , AMOUNT_SOLD numeric(10,2) NOT NULL) on commit preserve rows distributed randomly;
CREATE TEMP TABLE SALES (PROD_ID numeric NOT NULL , CUST_ID numeric NOT NULL , TIME_ID DATE NOT NULL , CHANNEL_ID numeric NOT NULL , PROMO_ID numeric NOT NULL , QUANTITY_SOLD numeric(10,2) NOT NULL , AMOUNT_SOLD numeric(10,2) NOT NULL) on commit delete rows distributed by (prod_id,cust_id,time_id,channel_id,promo_id);
例子一是事務內有效,鏈接會話間數據獨立。完成事務後數據保留,只有鏈接會話斷開後數據才消失。
例子二是事務內有效,也就是提交事務後(commit)數據就會消失。
若是臨時表的名字與永久表名字重複,臨時表的訪問優先。
除了普通表之外,GP還支持超大表進行分區應用,爲咱們的提升數據訪問效率的同時,也提升應用的靈活型。它能夠支持RANGE分區,LIST分區,以及靈活的複合分區(RANGE-LIST,RANGE-RANGE,LIST-RANGE,LIST-LIST,以及更多層次的分區,好比三層分區),GP的分區是基於segment基礎之上的。每一個分區的數據一樣會打散分佈到每一個segment中,當where條件上出現分區鍵時,它會進行分區裁剪,減小IO。須要注意的是,目前GreenPlum還只支持靜態分區裁剪,因此若是但願用到分區裁剪,請在Where條件中使用事實表的分區鍵做爲條件。
END 2018-08-01 18:17:13