优化COUNT(DISTINCT)SQL查询

时间:2017-10-03 15:56:05

标签: sql postgresql

我有两张桌子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 +

1 个答案:

答案 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)上尝试使用此查询的索引。