我有 3 个运行非常慢的查询。一般来说,所有这些都在做同样的事情:从 oracle 中的 View 中选择(viw oracle_fdw 扩展名)。所有的观点都是这样的: 选择/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 数据库获取数据的大函数的一部分发生的。在将数据导入 postgresql 中的本地表之前,我删除了本地表的索引和约束,并在导入数据后创建了它们。
关于我的服务器的一些信息:
我在服务器上有 5 GB RAM,还有 4 GB 是免费的。
我有2个cpu
关于我的 Postgresql 实例的一些信息:
目前我在实例上只有 1 db。
shared_buffers = 1000MB
effective_cache_size = 2GB
autovacuum = on
work_mem = 4MB
另外,我有很多selects * from foreign_Table。所有这些都需要一些时间,但那 3 个花费的时间太多了。请帮助提高这 3 个的性能,如果可以的话,请提高我的所有选择。
最佳答案
当您使用 sqlplus 执行查询时,查询是否运行得很快?
如果不行,就得在Orace端解决问题。
要查看oracle_fdw 使用的Oracle 执行计划,运行
EXPLAIN (VERBOSE) SELECT * FROM oracle_table1_view;
从 sqlplus 运行时检查它是否与计划相匹配。如果不是,请尝试找出差异并找出原因。
如果计划看起来相同,但执行时间不同,则可能是您选择了某些 LOB 列。如果涉及此类列,行预取将不起作用,因此对于每个选定的行,将有一个从 PostgreSQL 到 Oracle 的往返行程,这会使事情变得非常慢。
关于oracle - 提高查询性能——从oracle中选择数据到postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45351502/