使用子查询更新时,我在 postgresql 中的更新语句运行超过 1 小时

问题描述 投票:0回答:1

我有一个数据集,它有一些缺失值。这是一个时间序列数据集,因此我想用前一天的值更新缺失值。

我创建了一个视图,其中包含前两天的值的滞后。见下图:

销售日期 每日操作 lag_op1 lag_op2
2013-01-03 92.97 93.14
2013-01-04 93.12 92.97 93.14
2013-01-05 93.12 92.97

我的主表包含 300 万条记录,我想使用带有滞后操作变量的视图来估算主表中的缺失值。

我运行了这段代码:

update wholetest
   set daily_op = (select lag_op1 from lag_op where lag_op.sale_date = wholetest.sale_date)
   where daily_op is null; 

这需要一段时间,所以我跑向目标,然后我回来,它仍在运行。它的运行时间超过 1 小时,所以我认为即使它有很多记录,它也无法正常工作。

我尝试在 Wholetest.sale_date 之后添加“limit 1”选项,但这似乎不起作用。 (即具有滞后变量的视图具有一个不同的日期)。请让我知道我的代码做错了什么。

sql postgresql sql-update subquery
1个回答
0
投票

wholetest.sale_date上是否有

唯一索引
(或PK)?否则,您可能会得到任意结果 - 增加的成本与重复项的数量成正比。换句话说:昂贵的废话。

使用所述唯一索引,查询应该很快 - 好吧,300 万行将需要几秒钟。除非你搞乱了你未公开的观点。无论哪种方式,您都不需要为此提供视图。只是:

UPDATE wholetest w
SET    daily_op = (
   SELECT daily_op
   FROM   wholetest w1
   WHERE  w1.sale_date < w.sale_date
   ORDER  BY w1.sale_date DESC
   LIMIT  1
   )
WHERE w.daily_op IS NULL;

唯一的另一件事(除了存储、RAM 和/或 CPU 的损坏或严重争用之外)是锁定问题。通常在长时间运行的事务中并发写入表。在这种情况下,请检查系统视图

pg_stat_activity
。参见:

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.