Greenplum 6.0 新功能介紹 – Foreign Data Wrapper

什么是 FDW

FDW 是 SQL 標(biāo)準(zhǔn) SQL/MED(SQL Management of External Data)開發(fā)的 Postgres 實現(xiàn)。FDW 提供了一系列統(tǒng)一的公共接口,使得擴展程序可以輕松地在優(yōu)化、執(zhí)行、掃描、更新和統(tǒng)計等核心部分和 Postgres 深度集成,從而可以用 SQL 語句直接查詢和操作外部數(shù)據(jù)源。 例如 FDW for MySQL,用戶可以像操作本地表一樣地直接查詢,排序、分組、過濾、Join 甚至插入和更新 MySQL 的數(shù)據(jù)。除了自己動手實現(xiàn),社區(qū)已經(jīng)存在了很多的 FDW 擴展,Postgres 的官方 Wiki 頁面列舉了一部分常見數(shù)據(jù)源的 FDW 擴展。

Greenplum 6.0 的支持狀況

所有基于 Postgres 9.4 的 FDW 擴展都可以和 Greenplum 6.0 完美兼容。 默認(rèn)情況下,F(xiàn)DW 會運行在 Master 節(jié)點上,同時 Greenplum 也可以通過選項讓 FDW 運行在任意節(jié)點或者所有 Segment 節(jié)點上。 創(chuàng)建 FDW(以 postgres_fdw 為例):

gpadmin=# CREATE EXTENSION postgres_fdw;
CREATE EXTENSION

gpadmin=# CREATE SERVER s0 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.0.2.0', port '15432', dbname 'gpadmin');
CREATE SERVER

gpadmin=# CREATE USER MAPPING FOR gpadmin SERVER s0 OPTIONS (user 'gpadmin');
CREATE USER MAPPING

創(chuàng)建外部表,默認(rèn)運行在 Master 節(jié)點上:

gpadmin=# CREATE FOREIGN TABLE ft1 (c1 text) SERVER s0 OPTIONS (schema_name 'public', table_name 't1');
CREATE FOREIGN TABLE

gpadmin=# EXPLAIN VERBOSE SELECT * FROM ft1 WHERE c1 = 'foo';
                            QUERY PLAN
-------------------------------------------------------------------
 Foreign Scan on public.ft1  (cost=100.00..183.25 rows=6 width=32)
   Output: c1
   Remote SQL: SELECT c1 FROM public.t1 WHERE ((c1 = 'foo'::text))
 Optimizer: Postgres query optimizer
(4 rows)

查詢:

gpadmin=# SELECT * FROM ft1;
 c1
-----
 foo
 bar
(2 rows)

gpadmin=# SELECT * FROM ft1 WHERE c1 = 'foo';
 c1
-----
 foo
(1 row)

改為運行在所有 Segment 節(jié)點上(注意此時會有一個 Gather Motion):

gpadmin=# ALTER TABLE ft1 OPTIONS (mpp_execute 'all segments');
ALTER TABLE

gpadmin=# EXPLAIN VERBOSE SELECT * FROM ft1 WHERE c1 = 'foo';
                                   QUERY PLAN
---------------------------------------------------------------------------------
 Gather Motion 3:1  (slice1; segments: 3)  (cost=100.00..183.25 rows=6 width=32)
   Output: c1
   ->  Foreign Scan on public.ft1  (cost=100.00..183.25 rows=2 width=32)
         Output: c1
         Remote SQL: SELECT c1 FROM public.t1 WHERE ((c1 = 'foo'::text))
 Optimizer: Postgres query optimizer
(6 rows)

FDW 和 External Tables 的區(qū)別

  • External Tables 支持的外部數(shù)據(jù)源很有限,并且是 Greenplum 獨有的。而 FDW 可以輕松利用社區(qū)成百上千的 FDW 擴展。
  • 本質(zhì)上 External Tables 是基于 COPY 的,它的數(shù)據(jù)源需要先處理成 CSV 或者 TEXT 格式,效率比較低。而 FDW 直接獲取數(shù)據(jù)。
  • External Tables 和內(nèi)核的整合有限,基本沒有優(yōu)化,完全沒有下推。而 FDW 和內(nèi)核深度整合,可以提供優(yōu)化,下推和統(tǒng)計的功能。(目前 Greenplum 6.0 受限于 Postgres 內(nèi)核版本只做到了條件下推,后續(xù)版本會陸續(xù)支持其它下推)
  • External Tables 在 Greenplum 中會逐漸改用 FDW 實現(xiàn)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容