【发布时间】:2022-06-10 19:55:13
【问题描述】:
我在 PostgreSQL 数据库中有以下两个表(为了示例而简化):
article
| id | summary |
|---|---|
| 1 | Article 1 |
| 2 | Article 2 |
| 3 | Article 3 |
| ... | ... |
event
| id | article_id | eventtype_id | comment |
|---|---|---|---|
| 108 | 1 | 4 | Comment 1 |
| 109 | 2 | 8 | Comment 2 |
| 110 | 3 | 4 | Comment 3 |
| ... | ... |
我只想为每个article 选择 1 个event 和eventtype_id=4。结果应如下所示:
| article_id | article_summary | event_comment |
|---|---|---|
| 1 | Article 1 | Comment 1 |
| 2 | Article 2 | |
| 3 | Article 3 | Comment 3 |
| ... |
这两个查询(Query 1 或 Query 2)哪个运行得更快?它们返回相同的结果吗?
Query1:
SELECT
a.id AS article_id,
a.summary AS article_summary,
evnt.comment AS event_comment
FROM
article a
LEFT JOIN
event evnt ON evnt.article_id = a.id AND evnt.eventtype_id = 4;
Query2:
SELECT
a.id AS article_id,
a.summary AS article_summary,
(
SELECT
evnt.comment
FROM
event evnt
WHERE
evnt.article_id = a.id AND
evnt.eventtype_id = 4
LIMIT 1
) AS event_comment
FROM
article a;
【问题讨论】:
-
使用
explain (analyze, buffers)- 它会告诉你哪一个跑得更快。 ericlippert.com/2012/12/17/performance-rant -
Query2 在维护方面也是一个 PITA。您确定您(未来)团队中的每个人都能在半秒内阅读并理解这一点吗?如果没有,那就是您的代码出现新错误的时候。 LEFT JOIN 非常简单,很难错过。也不清楚为什么你有这个问题,你是唯一可以测量时间差异的人。我们没有您的数据。
-
我发现这两个查询甚至没有返回相同的结果。如果
Query 1与eventtype_id = 4关联的event超过1 个,则Query 1会为同一article生成多行。Query 2只为每个article生成 1 行,即使它与eventtype_id = 4关联的event有多个。
标签: sql postgresql query-optimization