Oracle Postgresql 9.6从外部表并行执行

Oracle Postgresql 9.6从外部表并行执行,oracle,postgresql,parallel-processing,oracle-fdw,Oracle,Postgresql,Parallel Processing,Oracle Fdw,我将postgresql从9.5升级到9.6,以便使用并行执行来提高性能。然而,我没有成功地使用它。在我的主数据库中,几乎所有的选择都是这样的: 从外部表格中选择* 外部表是位于oracle数据库上的外部表。 有些表是10G+和1000000+的大记录,所以并行查询在这种select情况下应该对我有很大帮助 我配置的参数: min_parallel_relation_size = 200MB max_parallel_workers_per_gather = 2 max_worker_proc

我将postgresql从9.5升级到9.6,以便使用并行执行来提高性能。然而,我没有成功地使用它。在我的主数据库中,几乎所有的选择都是这样的:
从外部表格中选择*
外部表是位于oracle数据库上的外部表。 有些表是10G+和1000000+的大记录,所以并行查询在这种select情况下应该对我有很大帮助

我配置的参数:

min_parallel_relation_size = 200MB
max_parallel_workers_per_gather = 2 
max_worker_processes = 8 
当我尝试从一个大表中使用explain analyze select*时,她的大小为1.5G,有5000000条记录,我只看到外部扫描:

 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=1的表中选择*,但结果仍然相同

另一方面,下一个代码起作用:

   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)
知道如何继续吗?

来自:

ForeignScan节点可以(可选)支持并行执行。A. 并行ForeignScan将在多个进程中执行,并且应 在所有协作进程中,每行只返回一次。做 这样,进程可以通过固定大小的动态数据块进行协调 共享内存。此共享内存不保证在 每个进程中都有相同的地址,因此不能使用指针。这个 以下回调通常都是可选的,但如果 支持并行执行


我已经搜索了Laurenz Albe的Oracle FDW源代码,它没有实现
IsForeignScanParallelSafe
,因此无法使用并行执行。

添加
ora_FDW
标记,希望引起Laurenz的注意。但我非常怀疑postgres并行执行设置是否会影响ExtensionTanks Lukasz。妈的,如果是这样的话,我有没有办法提高性能?取决于你对这些数据做了什么。是否可以单独(在分区中)处理它?您可以在Oracle server上创建实际分区吗?您可以尝试一些,也可以自己制作。您好,我无法在oracle server中对这些表进行分区。当你写“让你自己”的时候,你的意思是写一个扩展?一般来说,我只是从oracle server中的70个表中选择*到本地postgresql表中。不一定是扩展,更像是并行执行的机制/系统,类似于某种线程管理器。我们有这样的事情,我在工作,但它太复杂,无法回答,我将无法分享它无论如何。如果您不能在Oracle server上创建分区,那么您还必须找出如何有效地分割这些数据——这本身就需要很长的时间,因为有很多方法可以解决这个问题,而且所有这些方法都有其优缺点(遗憾的是,我现在找不到这篇文章)。