【问题标题】:Postgresql why is INNER JOIN so much slower than WHEREPostgresql 为什么 INNER JOIN 比 WHERE 慢得多
【发布时间】: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


【解决方案1】:

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

第一个版本中的两个table_as 是对表的两个不同引用。效果是cross join,因为你没有条件组合它们。

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

【讨论】:

  • 出于好奇,第二个查询的等价物如何写成INNER JOIN?
  • @Abe 。 . .你需要join 条件(在table_aa 之间的where 子句中)——也许在主键上。
猜你喜欢
  • 2019-10-09
  • 2015-03-03
  • 2013-02-07
  • 2023-01-30
  • 2020-01-09
  • 2010-11-17
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多