當需要查詢分散在不同數據庫中的數據時,您可以使用云原生數據倉庫 AnalyticDB PostgreSQL 版的跨庫查詢功能方便地將數據聚合在一起,進行高效查詢,提高數據訪問效率。
功能介紹
Database是PostgreSQL生態下數據庫的最高級別,同一個實例中的不同Database之間無法直接互相查詢數據,在保證了數據庫業務隔離的同時,也帶來了跨業務跨庫之間聯合查詢的不便。
在AnalyticDB PostgreSQL版中,您可以通過外部數據包裝器FDW(foreign-data wrapper)進行跨庫查詢,阿里云提供的FDW基于AnalyticDB PostgreSQL版的MPP架構打造,能夠充分發揮計算節點的性能優勢,提高跨庫查詢的數據訪問效率。
注意事項
高速跨庫查詢僅支持以下數據庫內核版本:
存儲彈性模式7.0版:V7.0.1.x及以上版本。
存儲彈性模式6.0版:V6.3.11.2及以上版本。
Serverless模式:V1.0.6.x以及上版本。
FDW外表僅支持SELECT和INSERT操作,不支持UPDATE和DELETE操作。
僅存儲彈性模式7.0版本支持JOIN下推和AGG下推功能。
僅存儲彈性模式7.0版本的ORCA優化器支持對FDW外表生成執行計劃,存儲彈性模式6.0版本和Serverless模式的ORCA優化器無法處理外表,會使用原生優化器生成執行計劃。
操作步驟
以下內容將為實例的兩個Database(db01和db02)之間開通數據互訪。開通后,您可以在db01庫訪問db02庫中的表。
使用psql連接實例,操作步驟,請參見客戶端連接。
創建db01庫和db02庫。
CREATE DATABASE db01; CREATE DATABASE db02;
在db01和db02庫創建跨庫查詢插件greenplum_fdw和gp_parallel_retrieve_cursor。具體操作,請參見安裝、升級與卸載插件。
切換到db02庫,準備測試數據。
\c db02 CREATE SCHEMA s01; CREATE TABLE s01.t1(a int, b int, c text); INSERT INTO s01.t1 VALUES(generate_series(1,10),generate_series(11,20),'t1');
切換到db01庫,創建SERVER和USER MAPPING。
創建SERVER。
\c db01 CREATE SERVER db02 FOREIGN DATA WRAPPER greenplum_fdw OPTIONS (host 'localhost', dbname 'db02');
參數說明。
參數
說明
host
跨庫訪問此處填寫
'localhost'
。dbname
源庫的名稱,此處示例為
db02
。創建USER MAPPING,更多關于USER MAPPING的介紹,請參見CREATE USER MAPPING。
CREATE USER MAPPING FOR CURRENT_USER SERVER db02 OPTIONS (user 'report', password '******');
參數說明。
參數
說明
user
數據庫賬號。
該賬號需要擁有db02庫的讀權限(如需執行INSERT操作,則還需要寫權限),如何創建賬號,請參見創建數據庫賬號。
password
以上賬號的密碼。
在db01庫實現跨庫查詢。
實現跨庫查詢有如下兩種方式:
為源表創建外表。
CREATE SCHEMA s01; CREATE FOREIGN TABLE s01.t1(a int, b int) server db02 options(schema_name 's01', table_name 't1');
上述方式的優缺點如下:
優點:可以靈活定制外表的DDL,例如db02庫中t1有三個字段a,b,c,但目標庫只需要a,b兩個字段,因此可以在創建外表的時候指定字段。
缺點:需要知道每一個表的DDL,一次性導入多個外表較為繁瑣。
導入源庫下Schema中的所有表。
CREATE SCHEMA s01; IMPORT FOREIGN SCHEMA s01 LIMIT TO (t1, t2, t3) FROM SERVER db02 INTO s01;
上述方式的優缺點如下:
優點:可以快速導入外表,而且不需要知道每一個表的DDL。
缺點:不夠靈活,每個表的名稱和源庫一致,字段也一致。
更多介紹,請參見IMPORT FOREIGN SCHEMA。
在db01庫查詢db02庫的數據。
查詢db01庫的數據。
SELECT * FROM s01.t1;
返回示例如下。
a | b | c ----+----+---- 2 | 12 | t1 3 | 13 | t1 4 | 14 | t1 7 | 17 | t1 8 | 18 | t1 1 | 11 | t1 5 | 15 | t1 6 | 16 | t1 9 | 19 | t1 10 | 20 | t1 (10 rows)
相關文檔
AnalyticDB PostgreSQL版還提供了跨實例查詢功能,詳情請參見跨實例查詢。