我将postgresql从9.5升级到9.6,以便使用并行执行来提高我的性能。但是,我没有成功使用它。在我的主数据库中几乎所有的选择看起来像:
min_parallel_relation_size = 200MB
max_parallel_workers_per_gather = 2
max_worker_processes = 8
外表是位于oracle数据库上的外表。
有些表是10G +和1,000,000+的大记录,所以并行查询应该可以帮助我在这种情况下选择。
我配置的参数:
Foreign Scan on customer_prod (cost=10000.00..20000.00 rows=1000
width=2438) (actual time=6.337..231408.085 rows=5770616 loops
=1)
Oracle query: ......
Planning time: 2.827 ms
Execution time: 232198.137 ms
当我尝试使用说明分析时,从大表中选择*,她的大小是1.5G并且有5,000,000条记录,我只看到外国扫描:
postgres=# CREATE TABLE people_mariel_test (id int PRIMARY KEY NOT NULL, age int NOT NULL);
CREATE TABLE
postgres=# INSERT INTO people_mariel_test SELECT id, (random()*100)::integer AS age FROM generate_series(1,10000000) AS id;
INSERT 0 10000000
postgres=# explain analyze select * from people_mariel_test where age=6;
QUERY PLAN
--------------------------------------------------------------------------------
------------------------------------------------
----------
Gather (cost=1000.00..123777.76 rows=50000 width=8) (actual time=0.239..771.801 rows=99409 loops=1)
Workers Planned: 1
Workers Launched: 1
-> Parallel Seq Scan on people_mariel_test (cost=0.00..117777.76 rows=29412 width=8) (actual time=0.045..748.213 rows=49704
loops=2)
Filter: (age = 6)
Rows Removed by Filter: 4950296
Planning time: 0.261 ms
Execution time: 785.924 ms
(8 rows)
*我也试过select * from foreign_table,其中1 = 1,但结果仍然相同。
另一方面,下一个代码有效:
select cast('00000000000039570' as decimal(19,0))*.01
我知道如何继续?
答案 0 :(得分:2)
ForeignScan节点可以选择支持并行执行。一个 并行的ForeignScan将在多个进程中执行,并且应该 在所有协作进程中仅返回每行一次。去做 这样,进程可以通过固定大小的动态块进行协调 共享内存。不保证映射此共享内存 每个进程中的地址相同,因此可能不会使用指针。该 以下回调通常都是可选的,但必须如果 支持并行执行。
我已经通过Laurenz Albe搜索了Oracle FDW的源代码,它没有实现IsForeignScanParallelSafe
,因此不能使用并行执行。