PostgreSQL提供foreign data wrapper的功能,讓使用者可以將任意的資料源(像是其他的資料庫,或是本機的檔案)透過Postgres來進行SQL查詢,並且得到和自身進行SQL查詢同樣格式的回傳結果。
1.首先針對想要使用的foreign data wrapper安裝之後,在資料庫上面CREATE EXTENSION
2.對foreign data wrapper CREATE EXTENSION之後,使用foreign data wrapper進行CREATE SEVER的動作
3.透過CREATE USER MAPPING指令,將本地的postgres使用者跟foreign data的使用者作對應
4.使用CREATE FOREIGN TABLE與之前建立的SERVER來建立foreign table,之後便能透過foreign data wrapper進行資料查詢
在想要把另一台Postgres資料庫上面的table作為foreign table的instance上面啟用擴充套件
CREATE EXTENSION postgres_fdw
然後再來下CREATE SERVER指令,先指定名稱,然後指定CREATE SERVER所要使用的foreign data wrapper,再來後面的OPTIONS將可選的設定值帶入foreign data wrapper,這裡帶入另一台伺服器的IP以及所要連線的資料庫及port
CREATE SERVER pg12_vm
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host '192.168.152.132', dbname 'foreign_test', port '5432');
接著將當前的使用者對應到remote server上面用來存取foreign table的使用者登入資訊
CREATE USER MAPPING FOR CURRENT_USER SERVER pg12_vm
OPTIONS (user 'gmfcd128', password 'pZ7Sugnw');
最後使用之前設定好的server以及遠端的table資訊來在本機上建立一個foreign table
create foreign table remote_student_data (student_id integer, grade integer, class integer, name varchar(20))
SERVER pg12_vm OPTIONS (schema_name 'public', table_name 'student_data');
建立完成之後,本機上對foreign table進行查詢就會從相應的資料源(這裡是另外一台Postgres資料庫)讀出資料,並且在本機得到SQL表格的執行結果,也可以和本機查詢的資料做結合。
//本地查詢結果+foreign table查詢結果,可以透過pgAdmin的側邊欄看到foreign data wrapper→foreign server→user mapping以及foreign table之間的關係
//單純local table的查詢結果
如果覺得手動建立foreign table的對應過於麻煩,Postgres也提供import foreign schema的功能,比如說可以輸入
IMPORT FOREIGN SCHEMA public
FROM SERVER customer_server INTO public;
這樣遠端伺服器上的schema裡面的table就會自動變成本地端的foreign table可以使用。
https://github.com/postgrespro/lsm
網路上有人透過foreign data wrapper的方式,將PostgreSQL與RocksDB對接在一起,由PostgreSQL語法查詢加上lsm-tree的資料儲存方式,在某些儲存裝置上的讀寫性能可以得到一定程度的提升。