【发布时间】:2015-08-01 19:03:33
【问题描述】:
我有这个过程必须使用 pl/pgsql 进行一系列查询:
--process:
SELECT function1();
SELECT function2();
SELECT function3();
SELECT function4();
为了能够在一次调用中执行所有操作,我创建了一个这样的流程函数:
CREATE OR REPLACE FUNCTION process()
RETURNS text AS
$BODY$
BEGIN
PERFORM function1();
PERFORM function2();
PERFORM function3();
PERFORM function4();
RETURN 'process ended';
END;
$BODY$
LANGUAGE plpgsql
问题是,当我把每个函数本身所用的时间相加时,总共是200秒,而函数process()所用的时间是一个多小时!
可能是内存问题,但我不知道应该更改postgresql.conf 上的哪个配置。
数据库在 Debian 8 中的 PostgreSQL 9.4 上运行。
【问题讨论】:
-
也许
perform会导致不同的查询计划?试试declare MyVar int; begin MyVar := (select function1());之类的? -
如果你选择 function1(), function2(), function3(), function4();然后 Postgresql 将能够并行运行所有四个函数。这并不意味着它会,但至少它可以。
-
@Andomar 我试过了,没解决:(
-
你能粗略地勾勒一下这些函数的作用吗?如果他们用了 200 秒,那么他们显然在做一些不平凡的工作。
-
我想我知道为什么会发生这种情况,但不知道如何避免:Postgres 函数周围有一个隐式事务,因此必须做额外的工作来维护日志或锁跨越所有 4 个内部函数。 (您可以通过在显式事务中定时运行所有 4 个函数来检查这是否是原因。)
标签: postgresql plpgsql database-performance query-performance postgresql-performance