更新多条记录 - 性能不佳

时间:2014-06-25 07:20:35

标签: sql database performance postgresql join

我想知道为什么要使用postgres在下面执行语句需要永远:

UPDATE left_table AS l
SET some_col=r.some_col
FROM right_table AS r
WHERE l.uid=r.uid

两个表都有列uid(数据类型varchar(50))

的索引

两个表都有近500k行。

没有重复uid - s,所以

  

目标行不应该从其他表连接到多行

不应该是这种情况。

虽然像这样的简单连接

SELECT * FROM  
left_table AS l
INNER JOIN
right_table as r
ON l.uid=r.uid

立即返回(花费不到1秒),第一个花费超过30分钟

修改

解释

的输出
"Update on left_table l  (cost=37989.79..575033.10 rows=484302 width=4270)"
"  ->  Hash Join  (cost=37989.79..575033.10 rows=484302 width=4270)"
"        Hash Cond: ((l.uid)::text = (r.uid)::text)"
"        ->  Seq Scan on left_table l  (cost=0.00..17307.02 rows=484302 width=4261)"
"        ->  Hash  (cost=27679.02..27679.02 rows=484302 width=47)"
"              ->  Seq Scan on right_table r  (cost=0.00..27679.02 rows=484302 width=47)"

1 个答案:

答案 0 :(得分:1)

所以我在简化的数据集上做了EXPLAIN ANALYZE,结果发现我在触发器上做了一些昂贵的事情。所以有类似问题的人都记住: EXPLAIN ANALYZE 是你的朋友