我需要创建临时表,然后在选择查询中使用该临时表。当我将这些语句放在一个函数中时,运行第二个语句需要很长时间。像这样:
BEGIN
CREATE TABLE temp AS SELECT….
INSERT INTO target_table SELECT * FROM tableA join temp…
END;
我意识到当我在运行之间大约60秒单独运行它们时,第二个语句需要大约2秒才能运行。如果我等了45秒,它将需要很长时间才能运行。例如,如果我逐个执行以下语句(不在函数中):
CREATE TABLE temp AS SELECT….
SELECT pg_sleep(60);
INSERT INTO target_table SELECT * FROM tableA join temp…
执行INSERT会花费很短的时间。但是当我突出显示它们并将它们全部一起运行时,它又花了很长时间再次执行。
我试图将它们放在不同BEGIN / END块中的函数中。喜欢这个
BEGIN
CREATE TABLE temp AS SELECT….
SELECT pg_sleep(120);
END;
BEGIN
INSERT INTO target_table SELECT * FROM tableA join temp…
END;
仍然无效。
为什么要介于两者之间?放入功能时为什么它们不起作用?这个问题有解决方法吗?
答案 0 :(得分:2)
我强烈怀疑问题在于选择计划,因为该表还没有统计数据。尝试:
CREATE TABLE temp AS SELECT….
ANALYZE;
INSERT INTO target_table SELECT * FROM tableA join temp…
P.S。使用真实椭圆的+1。
答案 1 :(得分:0)
这不是问题的直接答案,但如果问题是你觉得你需要一个这样的临时表,这很少需要,那么我会按照以下顺序尝试以下三种选择之一:< / p>
要诊断您的实际问题,我会研究通过跟踪或使用AWR来监控会话。