我想知道为什么要使用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)"
答案 0 :(得分:1)
所以我在简化的数据集上做了EXPLAIN ANALYZE,结果发现我在触发器上做了一些昂贵的事情。所以有类似问题的人都记住: EXPLAIN ANALYZE 是你的朋友