我有两个表,在更新操作中将文件名从一个表复制到另一个表。使用INNER JOIN可以使查询在22秒内运行,而此时只有大约4000行。使用WHERE子句允许它在大约200毫秒内运行它。如何以及为什么会发生这种情况,内部连接会导致额外的循环吗?
示例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;

示例2使用运行时间约为200毫秒的WHERE。
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;

最佳答案

查询所做的是完全不同的事情。第一个是用表达式更新table_a中的每一行。我猜同一行甚至有多个更新。
第一个版本中的两个table_as是对表的两个不同引用。效果是across join,因为没有条件组合它们。
第二种方法是在Postgres中正确的语法。

关于sql - PostgreSQL为什么INNER JOIN比WHERE慢得多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53381176/

10-15 21:28