PostgreSQL:更新两列非常慢

时间:2013-11-17 02:48:44

标签: sql postgresql

PostgreSQL版本是9.2。数据表包含超过1亿行。它有四列:a,b,c和d。列a和b是字符变化类型。我想添加两列:e =最少(a,b)和f =最大(a,b)。代码是

UPDATE table
SET e=least(a,b),f=greatest(a,b)

但过了36个小时后,它仍在运行。为什么更新这么慢?


更新: 当我使用'select into'方法时,它只用了40分钟就完成了! 现在我需要了解更多关于PostgreSQL函数的实现方式。

2 个答案:

答案 0 :(得分:2)

我的猜测是这是一个锁定问题。可能发生的是更新正在等待另一个未提交的更新。

要做的第一件事是查看pg_locks视图。之后,您可以尝试重新启动PostgreSQL(方便时)并重新运行更新查询。您也可以尝试将NOWAIT添加到更新语句中:

SELECT * FROM table FOR UPDATE NOWAIT;  UPDATE table SET ...

这将导致异常,而不是等待释放锁。

答案 1 :(得分:0)

硬件统计?内存?磁盘速度?这些事情有助于确定像这样的开放式问题的答案。

e和f是否已编入索引?

由于您要更新整个表格,您是否尝试过INSERT INTO some_temp_table SELECT least(a,b) e, greatest(a,b) f FROM yourtable? UPDATE操作传统上是您可以执行的最慢的DML操作。