【发布时间】:2019-04-22 04:46:45
【问题描述】:
我有 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;
【问题讨论】:
-
我认为第一个查询缺少将
table_a的第一个引用连接到第二个引用的信息。因此,我认为它会更新更多数据(所有行,多次)。那么,第一个查询的目标是什么?为什么要这样写? -
是的,似乎就是这样。我只是想知道 INNER JOIN 是如何最终成为交叉连接的,看起来这是因为 2 个表 a 引用不同。
标签: sql postgresql inner-join