sql - 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;
解决方案
查询正在做完全不同的事情。第一个是用表达式更新每一行。table_a
我猜在同一行上什至有多个更新。
table_a
第一个版本中的两个s 是对 table 的两个不同引用。效果是 across join
因为你没有条件组合它们。
第二种方法是您想要在 Postgres 中执行的操作的正确语法。
推荐阅读
- python-3.x - 分割图像数据集
- mongodb - 如何控制 mongo 脚本?
- hl7-fhir - 将智能健康卡用于疫苗接种记录以外的目的
- azure - 使用 azure Apim 调用使用 OAuth2 令牌的 Api
- python - 遗传算法:收敛问题
- proxy - Dante socks5 代理在没有 socks5-hostname 的情况下无法工作
- javascript - 如何在 vueJS 中动态更改样式模式
- autodesk-forge - getProperties 结果为英文
- amplitude - 幅度开始会话/结束会话报告错误
- ios - NSURLConnection 错误日志错误代码:-1003