随着第二个表中的记录数增加,LEFT JOIN变得很重

时间:2015-02-03 15:15:44

标签: sql-server join

我正在尝试使用SELECT运行LEFT JOIN查询。我在第二张桌子上找到了COUNTLEFT JOIN右侧的表格)。当第二个表上的记录数量增加时,此过程会稍微变重。我的第一张和第二张桌子有一对多的关系。第二个表的CampaignId列是第一个表Id的外键。这是我的查询的简化版本:

SELECT a.[Id]
       ,a.CampaignId
       ,a.[Inserted] AS 'Date'
       ,COUNT(b.Id) AS 'Received'
  FROM [CampaignRun] AS a
  LEFT JOIN [CampaignRecipient] AS b
           ON a.Id = b.CampaignRunId
  GROUP BY 
           a.[Id], a.CampaignId,a.[Inserted]
  HAVING 
           a.CampaignId = 637
  ORDER BY 
           a.[Inserted] DESC

数字637只是一个记录的示例。

有没有办法让这个查询运行得更快?

2 个答案:

答案 0 :(得分:1)

使用子选择来计算Received:

SELECT a.[Id]
       ,a.CampaignId
       ,a.[Inserted] AS 'Date'
       , (SELECT COUNT(*) FROM [CampaignRecipient] AS b
          WHERE a.Id = b.CampaignRunId ) AS 'Received' 
  FROM [CampaignRun] AS a
  WHERE a.CampaignId = 637
  ORDER BY a.[Inserted] DESC

答案 1 :(得分:1)

您在此处没有HAVING条款,您可以转到WHERE条款

SELECT a.[Id]
       ,a.CampaignId
       ,a.[Inserted] AS 'Date'
       ,COUNT(b.Id) AS 'Received'
  FROM [CampaignRun] AS a
  LEFT JOIN [CampaignRecipient] AS b
  ON a.Id = b.CampaignRunId
  WHERE a.CampaignId = 637
  GROUP BY a.[Id], a.CampaignId,a.[Inserted]
  ORDER BY a.[Inserted] DESC

还要确保在[CampaignRecipient]列的CampaignRunId表中包含外键索引。这被认为是一种很好的做法。