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函数的实现方式。
答案 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操作。