首页 > 解决方案 > Postgresql 为什么 INNER JOIN 比 WHERE 慢得多

问题描述

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

标签: sqlpostgresqlinner-join

解决方案


查询正在做完全不同的事情。第一个是用表达式更新每一行table_a我猜在同一行上什至有多个更新。

table_a第一个版本中的两个s 是对 table 的两个不同引用。效果是 across join因为你没有条件组合它们。

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


推荐阅读