社群 postgresql 和 greenplum 都提供了讀寫外部資料源的方法,它們都提供了一套程式設計接口,使用者可以在這上面做二次開發,建立外部資料源和資料庫間的資料通道。
本文介紹 postgresql 和 greenplum 這部分程式設計接口的實作和程式設計方法。結合 rds 開發的 oss_ext 接口。展示外部資料源接口的能力。
fdw 的全稱是 foreign-data wrapper,是一套讀寫外部資料源的程式設計接口。它提供了多個回調函數程式設計接口,開發者可以逐一實作這些接口,封裝成動态庫,然後加載到核心中使用。
下面逐一介紹下這套程式設計接口
getforeignrelsize_function getforeignrelsize;
傳回給資料庫對應資料源的規模資訊
getforeignpaths_function getforeignpaths;
優化器接口,提供對應資料源的查詢路徑。
getforeignplan_function getforeignplan;
優化器接口,提供對應資料源的查詢計劃。
beginforeignscan_function beginforeignscan;
執行器接口,外部表掃描開始的準備工作。
iterateforeignscan_function iterateforeignscan;
執行器接口,外部表掃描實作,一次傳回一個 tuple slot。
rescanforeignscan_function rescanforeignscan;
執行器接口,外部表掃描節點重新開始,重置所有狀态參數和記憶體結構。
endforeignscan_function endforeignscan;
執行器接口,外部表掃描節點結束,釋放資源。
addforeignupdatetargets_function addforeignupdatetargets;
構造要更新的外部資料源的目标列資訊
planforeignmodify_function planforeignmodify;
構造外部資料源修改的(包括insert update delete的)的資料結構
beginforeignmodify_function beginforeignmodify;
執行器接口,資料更新節點的資料準備
execforeigninsert_function execforeigninsert;
執行器接口,insert 一行資料
execforeignupdate_function execforeignupdate;
執行器接口,update 一行資料
execforeigndelete_function execforeigndelete;
執行器接口,delete 一行資料
endforeignmodify_function endforeignmodify;
執行器接口,修改結束,釋放相關資源
isforeignrelupdatable_function isforeignrelupdatable;
explainforeignscan_function explainforeignscan;
展示掃描節點的相關資訊
explainforeignmodify_function explainforeignmodify;
展示修改資料節點的相關資訊
analyzeforeigntable_function analyzeforeigntable;
分析外部資料的資料分布狀況接口
使用者可以根據需求實作他們,如隻需要讀取資料,則不用實作第二部分;
除了支援讀取資料相關接口,還支援了對統計資訊的接入。這樣,postgresql 真正的把外部資料源當作了“表”。考慮到了資料的規模,使得優化器合理的規劃了外部表的執行路徑。和執行階段執行器深度結合。整套接口設計清晰分工明确;
greenplum external table 在實作上和 postgresql fdw 完全不同,有自己的特點:
greenplum 隻提供了兩個對外的接口 readfunc 和 writefunc;
greenplum external table 接口和核心互動的的内容是資料塊,而 postgresql fdw 是 tuple slot。
也就是說,通過 postgresql fdw 需要把外部資料源做完整的行列解析,而 greenplum external table 則不同;
最大的不同 greenplum external table 執行過程中是驅動 segment 工作,可以通過這個接口讓所有 segment 同時并行工作并行讀寫資料,大大提高了整個叢集的性能;
greenplum external table 沒有像 postgresql fdw 那樣的讀取統計資訊,并提供給優化器的接口,在複雜查詢場景下使用 greenplum external table 可能查詢計劃不是最優的;
readfunc
按資料塊讀取資料
writefunc
按資料塊寫資料
基于上述程式設計接口,我們開發了一套用于從 oss 導入資料到 greenplum 和 postgresql 的插件,性能杠杠的。幫助雲上使用者更好的使用 rds 資料庫産品。
<a href="https://yq.aliyun.com/articles/31632" target="_blank">從 oss 導入資料到 greenplum</a>