【发布时间】:2016-03-02 03:08:20
【问题描述】:
我是 SQL 新手,我终于设法组合了一个查询,该查询返回我正在寻找的值!唯一的问题是,这运行得很慢,大概是因为存在子句。我希望添加 LIMIT 会显着加快速度,但不幸的是,我凭经验发现这不是真的。
是否有另一种方法可以编写此查询以“可接受”的速度返回相同的值?我意识到“可接受”是主观的,但我只是在寻找新的方法。
这里是使用的表格:
content
---------------------------------------
id | Int
---------------------------------------
content_revision
---------------------------------------
id | Int
content_id | ForeignKey (content)
---------------------------------------
这是我的慢查询:
SELECT outer_content.id AS "TEN_MOST_RECENT_CONTENTS_WITH_ONE_REVISION"
FROM content outer_content
JOIN content_revision ON outer_content.id = content_revision.content_id
WHERE EXISTS (
SELECT inner_content.id
FROM content_revision
JOIN content inner_content ON content_revision.content_id = inner_content.id
WHERE outer_content.id = inner_content.id
GROUP BY inner_content.id HAVING count(*) = 1
)
ORDER BY ts_created DESC
LIMIT 10;
我有兴趣找到“TEN_MOST_RECENT_CONTENTS_WITH_ONE_REVISION”
【问题讨论】:
-
生成一个执行计划并查看最昂贵的操作(一个好的 DBA 可以提供极大的帮助)。
ts_created上的索引可能会有所帮助。请注意,LIMIT对实际查询性能没有帮助,因为它可能需要扫描整个表才能找到“前 10”个结果。 -
你不能用
SELECT inner_content.id FROM content_revision JOIN content inner_content ON content_revision.content_id = inner_content.id GROUP BY inner_content.id HAVING count(*) = 1 ORDER BY ts_created DESC LIMIT 10; -
@artm - 我希望能够做这样的事情,不幸的是这会导致错误......因为我按
inner_content.id分组,我不能按ts_created订购,因为那里可能是用不同的 ts_created 组合在一起的多个列。按两列分组将撤消 GROUP BY 语句,因为 ts_created 值基本上都是唯一的。 :( -
@RobertKotcher 将
max(ts_created)添加到选择列表和order by max(ts_created) desc
标签: sql performance postgresql optimization