什么是 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)。