PG 14中的postgres_fdw增强功能
Tags: PGPG14postgres_fdw新特性
Foreign Data Wrappers(FDW)提供了一种机制,通过这种机制,可以使用常规SQL查询访问PostgreSQL之外的数据。PostgreSQL附带了“File FDW”和“PostgreSQL FDW”。PostgreSQL FDW可能看起来有悖常理,但它是一个非常有用的功能。这个版本的FDW有一些非常有用的更新。
所以,让我们开始了解发生了什么变化。
性能特征
如果您已经在使用PostgreSQL FDW,请注意性能的改进。
1 – 并行/异步 外部扫描
(允许一个查询引用多个外部表,并行执行外部表扫描)
当在多台服务器上执行远程聚合和远程连接时,可能会造成性能噩梦。现在可以异步并行执行。之前的顺序执行非常缓慢,在某些情况下,速度会很慢。为此,添加了一个新的选项async_capable
,它允许并行计划和执行外部表扫描。
创建服务和用户映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | -- Create foreign server 1. CREATE SERVER postgres_svr1 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', async_capable "true"); -- Create foreign server 2. CREATE SERVER postgres_svr2 FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '127.0.0.1', async_capable "true"); CREATE USER MAPPING FOR vagrant SERVER postgres_svr1 OPTIONS (user 'postgres', password 'pass'); CREATE USER MAPPING FOR vagrant SERVER postgres_svr2 OPTIONS (user 'postgres', password 'pass'); |
创建本地表
1 2 3 4 5 6 | CREATE TABLE parent_local (a INTEGER, b CHAR, c TEXT, d VARCHAR(255)) PARTITION BY RANGE (a); CREATE TABLE child_local1 (a INTEGER, b CHAR, c TEXT, d VARCHAR(255)); CREATE TABLE child_local2 (a int, b CHAR, c text, d VARCHAR(255)); GRANT ALL ON child_local1 to postgres; GRANT ALL ON child_local2 to postgres; |
创建外部表
1 2 3 4 5 6 7 8 9 | CREATE FOREIGN TABLE parent_remote1 PARTITION OF parent_local VALUES FROM 1000 TO 2000 SERVER postgres_svr1 OPTIONS table_name 'child_local1'); CREATE FOREIGN TABLE parent_remote2 PARTITION OF parent_local FOR VALUES FROM 2000 TO 3000 SERVER postgres_svr2 OPTIONS table_name 'child_local2'); |
看看计划树,现在你可以在计划树中看到两个异步的外部扫描计划。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE TABLE sample_table (a INTEGER, b CHAR, c TEXT, d VARCHAR(255)); EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO sample_table SELECT * FROM parent_local WHERE a % 100 = 0; QUERY PLAN ---------------------------------------------------------------------------------------------- Insert on public.sample_table -> Append -> Async Foreign Scan on public.parent_remote1 parent_local_1 Output: parent_local_1.a, parent_local_1.b, parent_local_1.c, parent_local_1.d Remote SQL: SELECT a, b, c, d FROM public.child_local1 WHERE (((a % 100) = 0)) -> Async Foreign Scan on public.parent_remote2 parent_local_2 Output: parent_local_2.a, parent_local_2.b, parent_local_2.c, parent_local_2.d Remote SQL: SELECT a, b, c, d FROM public.child_local2 WHERE (((a % 100) = 0)) (8 rows) |
2 – 批量插入
(允许postgres_fdw批量插入行。)
现在,批量插入功能已添加到FDW中,postgres_fdw现在支持该功能。其他FDW也有机会实现批量插入。你可以在这里看到。
功能特性
1 – TRUNCATE 命令
(允许TRUNCATE
对外部表进行操作)
这意味着它会向外部服务器出TRUNCATE
命令,并在表上执行。这个功能是在postgres_fdw中实现的。下面是一个例子。