CREATE TABLE AS运行后需要很长时间的SELECT

时间:2014-02-11 19:13:18

标签: sql postgresql insert

我需要创建临时表,然后在选择查询中使用该临时表。当我将这些语句放在一个函数中时,运行第二个语句需要很长时间。像这样:

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;

仍然无效。

为什么要介于两者之间?放入功能时为什么它们不起作用?这个问题有解决方法吗?

2 个答案:

答案 0 :(得分:2)

我强烈怀疑问题在于选择计划,因为该表还没有统计数据。尝试:

CREATE TABLE temp AS SELECT….
ANALYZE;
INSERT INTO target_table SELECT * FROM tableA join temp…

P.S。使用真实椭圆的+1。

答案 1 :(得分:0)

这不是问题的直接答案,但如果问题是你觉得你需要一个这样的临时表,这很少需要,那么我会按照以下顺序尝试以下三种选择之一:< / p>

  1. 使用子查询而不是临时表。优化器非常擅长处理复杂的SQL。
  2. 使用公用表表达式(WITH子句):如果结果集非常大,那么数据将实现为临时段,如果不是,则可以将其视为子查询。
  3. 使用全局临时表。您不必使用execute immediate,并且可以对表进行索引或收集统计信息(由于优化器动态采样,很少需要)。
  4. 要诊断您的实际问题,我会研究通过跟踪或使用AWR来监控会话。

相关问题