PG 9.x 引入了 fdw,可以通过 pg 去连接其他 db,不仅限于其他 pg,还可以是 mysql,oracle,文件等。按照设计,fdw 还应该提供给查询规划器一些对方 db 的索引等信息,这样在查询过程中可以提升查询速度。



dbi_link




dbi 就是 perl 的 dbi,总的思想就是通过 plperl 写一些 function(所以也给了调试修改的便利),通过 dbi 去连接其他数据库,可以连接的 db 和 dbi 的支持一样。



测试了一下,第一次连接的时候会 cache 对方 db 的信息,对于复杂库没测试成功,只有一个表的库连接成功,并且可以查询。查询的时候就和查询本地库没有区别。



效率上面看,不是很高,每次查询都必然需要获取对方全部数据。就算是有 where 条件,也不会试用到对方 db 的索引。所以综合来看,只是提供了一个简单的方法来获取数据,最好是一次性的。





db_link




db_link 本身是 pg 自带的,contrib 里面的。db_link 只支持 pg,建立连接之后,后续查询可以只指定使用哪个连接即可。



相对 dbi_link,使用起来稍微复杂一点,需要特定的格式。效率上面看,查全表数据比 dbi_link 快。



他有个优势是每次查询对方库的时候都需要指定一个 sql,而如果只需要少量数据的时候,可以在 sql 里面直接使用 where 来过滤数据,这样就能使用对方 db 的索引了,速度快很多。不过就是稍微有点繁琐。





fdw




http://www.postgresonline.com/journal/archives/250-File-FDW-Family-Part-1-file\_fdw.html 这里有个链接,讲了 file fdw。其他 fdw 还没有试过。我理解 fdw 是否能使用对方 db 的索引,还需要看 fdw 的实现。file fdw 提供了类似 oracle 外部表一样的东西。实际上早年间 yahoo 的兄弟写过一个外部表的 pg 扩展的,不知道是不是这个 file fdw 就是从那来的。