我有2个表,其中在更新操作中将文件名从一个表复制到另一个表。当只有约4000行时,使用INNER JOIN可使查询在22秒内运行。使用WHERE子句可以使其在大约200毫秒内运行。发生这种情况的方式和原因,INNER JOIN是否会导致其他循环?
使用INNER JOIN的示例1-当表a大约有4k条记录时,花费22秒。
UPDATE table_a SET file_name = tmp.file_name FROM
(
SELECT b.customer_id, b.file_name, b.file_id FROM table_b AS b WHERE b.status = 'A'
) tmp
INNER JOIN table_a AS a
ON tmp.customer_id=a.customer_id AND tmp.file_id=a.file_id;
使用WHERE的示例2在大约200毫秒内运行。
UPDATE table_a AS a SET file_name = tmp.file_name FROM
(
SELECT b.customer_id, b.file_name, b.file_id FROM table_b AS b WHERE b.status = 'A'
) tmp
WHERE tmp.customer_id=a.customer_id AND tmp.file_id=a.file_id;
答案 0 :(得分:2)
查询正在做的事情完全不同。首先是使用表达式更新table_a
中的每一行。我猜想同一行甚至有多个更新。
第一版中的两个table_a
是对该表的两个不同引用。效果是cross join
,因为您没有条件将它们组合在一起。
第二种方法是您要在Postgres中执行的正确语法。