【发布时间】:2014-11-12 13:33:40
【问题描述】:
我在尝试创建临时表时遇到了性能问题。以下代码是plpgsql函数的一部分:
StartTime := clock_timestamp();
CREATE TEMP TABLE wo_tmp WITH (OIDS) AS
SELECT workorders1_.woid AS w_id, workorders1_.woid4seg AS w_id4seg
FROM common.workorders workorders1_
INNER JOIN common.lines lines2_ ON workorders1_.wolineid=lines2_.lineid
INNER JOIN common.products products2_ ON workorders1_.woprodid=products2_.prodid
INNER JOIN common.depts depts3_ ON lines2_.linedeptid=depts3_.deptid
WHERE workorders1_.wostatus='F'
AND workorders1_.wotypestatus = ANY ('{R,C,I,D}'::text[])
AND (p_deptid = 0 OR (depts3_.deptid = p_deptid AND ((p_deptid = 5 AND workorders1_.wosegid = 1) OR workorders1_.wosegid = 4)))
AND (p_lineid = 0 OR lines2_.lineid = p_lineid)
AND (p_prodid = 0 OR products2_.prodid = p_prodid)
AND (p_nrkokili = 0 OR workorders1_.wonrkokili = p_nrkokili)
AND (p_accepted = TRUE OR workorders1_.worjacceptstatus = 'Y')
AND workorders1_.wodateleaverr BETWEEN p_dfr AND p_dto
AND lines2_.status <> 'D';
CREATE INDEX wo_tmp_w_id_idx
ON wo_tmp USING btree (w_id ASC NULLS LAST);
CREATE INDEX wo_tmp_w_id4seg_idx
ON wo_tmp USING btree (w_id4seg ASC NULLS LAST);
EndTime := clock_timestamp();
Delta := extract('epoch' from EndTime)::bigint - extract('epoch' from StartTime)::bigint;
RAISE NOTICE 'Duration [0] in seconds=%', Delta;
这是explain analyze 报告:http://explain.depesz.com/s/uerF
很奇怪,因为当我执行这个函数时,我得到了通知:Duration [0] in seconds=11。我在没有创建临时表的情况下检查查询,结果时间是~300ms。
将记录 (~73k) 插入临时表是否可能需要 11 秒?我可以加快速度吗?
【问题讨论】:
-
索引创建也可能需要一些时间。对过程中的每个查询运行
EXPLAIN ANALYZE。 -
我跑了,但只创建临时表需要时间。
-
请始终包含函数页眉和页脚,这是必不可少的细节。另外,pg 8.4 has reached eol and is not supported any more。紧急考虑升级到当前版本。
标签: postgresql plpgsql temp-tables postgresql-8.4