天天看點

PG&GP · 特性分析 · 外部資料導入接口實作分析

社群 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>