Postgresql为什么INNER JOIN比WHERE慢得多

时间:2018-11-19 19:13:32

标签: sql postgresql inner-join

我有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;

1 个答案:

答案 0 :(得分:2)

查询正在做的事情完全不同。首先是使用表达式更新table_a中的每一行。我猜想同一行甚至有多个更新。

第一版中的两个table_a对该表的两个不同引用。效果是cross join,因为您没有条件将它们组合在一起。

第二种方法是您要在Postgres中执行的正确语法。

相关问题