Postgresql 里面连接其他数据库

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 就是从那来的。



Happy every day!

Good good study, day day up!


2012-05-06