【问题标题】:Inserting zero rows takes 2 minutes插入零行需要 2 分钟
【发布时间】:2021-12-08 01:47:32
【问题描述】:

我有一个用插入完成的长选择语句,选择在几秒钟内返回零行,但插入部分需要 1 到 2 分钟....

 with t1 as ()

insert into myscheme.sometable -- if I comment this line it will return zero rows in 3 sec

select t1  

为了更加简化,这段代码是 3 秒,结果是零行:

 with t1 as ()

select t1 

以下是 2 分钟,但它使用 select 语句运行 3 秒。(也用于插入零行):

 with t1 as ()
insert into myscheme.sometable
select t1 

【问题讨论】:

  • 让我猜猜 - 主要选择包括来自 myscheme.sometable 的内容?您可以选择需要的行到临时表中并从那里插入吗?
  • 正确 :) 我正在检查某些数据是否已经存在,以便将它们包含在最终插入中。选择实际上在某些部分确实很重,因此为了避免这些计算,我检查是否已经处理了一些数据。希望减少计算时间,但实际上情况更糟。
  • 您需要编辑您的问题,添加实际语句,并为慢查询添加EXPLAIN (ANALYZE, BUFFERS) 输出。
  • 一如既往,你的 Postgres 版本。

标签: sql postgresql query-optimization


【解决方案1】:

所以我使用 Arvo 建议来处理 tmp 表:

select needed rows into temporary table and insert from there?

不知道为什么 postgres 在优化的时候会做这样的反优化,但是 tmp table 的技巧已经足够好了!

总而言之 - 在插入之前插入到也用于选择查询的表中时 - 最好是创建临时表并从该表中插入。

【讨论】:

  • 如果没有 EXPLAIN (ANALYZE, BUFFERS) 的结果,您将不知道发生了什么以及为什么查询很慢。声明您需要一个临时表只是一个疯狂的猜测,并不能保证它明天或下周可以工作。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
相关资源
最近更新 更多