1

我有 3 个运行速度非常慢的查询。所有这些通常都在做同样的事情:从 oracle 中的视图中选择(viw oracle_fdw 扩展)。所有视图看起来像这样:select / parallel (table_Name,4) / column1,column2,replace(column 3,' ',null),...,replace(...),column8 from table_name。

*我每个表都有 40 多列,所以我只是提到了查询的格式。

我在 postgresql 中运行的选择如下所示:

select * from oracle_table1_view;
  • table1 大小为 10G,有 100,000,000 条记录。

  • table2 大小为 1.3G,有 6,000,000 条记录。

  • table3 大小为 8G,有 75,000,000 条记录。

所有这些都是作为从 oracle db 获取数据的大函数的一部分发生的。在将数据导入到 postgresql 中的本地表之前,我删除了本地表的索引和约束,并在导入数据之后创建了它们。

关于我的服务器的一些信息:

  • 我在服务器上有 5 GB RAM,其中 4 个是免费的。

  • 我有 2 个 CPU

关于我的 Postgresql 实例的一些信息:

目前我在实例上只有 1 db。

shared_buffers = 1000MB
effective_cache_size = 2GB
autovacuum = on
work_mem = 4MB

此外,我有很多选择 * from foreign_Table。所有这些都需要一些时间,但是这 3 个都花费了太多时间。请帮助提高这 3 个的性能,如果可以的话,我的所有选择。

4

1 回答 1

2

当您使用 sqlplus 执行查询时,查询是否运行得很快?

如果没有,您必须在 Orace 方面解决问题。

要查看 oracle_fdw 使用的 Oracle 执行计划,请运行

EXPLAIN (VERBOSE) SELECT * FROM oracle_table1_view;

当您从 sqlplus 运行时,检查这是否与计划匹配。如果不是,请尝试找出差异并找出原因。

如果计划看起来相同,但执行时间不同,则可能是您选择了一些 LOB 列。如果涉及此类列,行预取将不起作用,因此对于每个选定的行,从 PostgreSQL 到 Oracle 都会有一次往返,这会使事情变得非常慢。

于 2017-07-28T11:23:49.783 回答