我有两张桌子A,B:
A包含两列,与B(数千)相比行数相对较少:
id, build_id (string)
B包含三列并且有大量行(数十万):
id, build_id (string), task_id (string)
给定版本可能有许多任务。我想获取一个表,其中包含每个构建的所有构建和最新任务ID以及该构建的任务数。我的查询如下:
SELECT
A.build_id,
MAX(B.id) as latest_task_id,
COUNT(DISTINCT B.task_id) AS task_count
FROM
A
LEFT OUTER JOIN
B ON B.build_id = A.build_id
GROUP BY
A.build_id
有没有办法优化这个? build_id和task_id上已有索引。
更新:这是在postgres 9.6 +
上答案 0 :(得分:0)
尝试在join
之前进行汇总:
SELECT A.build_id,
MAX(B.id) as latest_task_id,
COUNT(B.task_id) AS task_count
FROM A LEFT OUTER JOIN
(SELECT B.build_id, B.task_id, MAX(B.id) as id
FROM B
GROUP BY B.build_id, B.task_id
) B
ON B.build_id = A.build_id
GROUP BY A.build_id;
有时,整体聚合算法比COUNT(DISTINCT)
更有效。
您还可以在B(build_id, task_id, id)
上尝试使用此查询的索引。