通过连接2个表来获取用于计数记录的数据时,SQL查询会进行调整

时间:2015-01-07 12:53:47

标签: sql-server

我在连接表时从获取大量记录时遇到问题。请参阅以下查询:

SELECT 
  H.EIN, 
  H.OUC, 
  (
    SELECT 
      COUNT(1) 
    FROM 
      tbl_Checks C 
    INNER JOIN INFM_People_OR.dbo.tblHierarchy P 
      ON P.EIN = C.EIN_Checked 
    WHERE 
      (H.EIN IN (P.L1, P.L2) 
      OR H.EIN = C.EIN_Checked) 
      AND C.[Read] = 1 
  ) AS [Read] 
FROM 
  INFM_People_OR.dbo.tblHierarchy H 
  LEFT JOIN tbl_Checks C 
    ON H.EIN = C.EIN_Checked 
WHERE 
  H.L1 = @EIN 
GROUP BY 
    H.EIN, 
    H.OUC,
    C.Check_Date

即使只有100条记录,此查询也需要更长的时间(大约1分钟)。

请建议一个解决方案来调整此查询,因为它在前端抛出错误

2 个答案:

答案 0 :(得分:0)

鉴于只有查询,有一些事情表明非理想:

OR的任何使用都会变慢:

WHERE 
  (H.EIN IN (P.L1, P.L2) 
  OR H.EIN = C.EIN_Checked) 
  AND C.[Read] = 1 

如果有任何方法可以根据您的数据集进行返工,那么IN和OR都将被替换为有用的AND。

另外,在WHERE子句中使用局部变量对优化器不起作用:

WHERE 
  H.L1 = @EIN

最后,确保你有连接和分组的索引(希望这些是整数字段)(H.EIN,H.OUC,C.Check_Date

结果集的大小(100条记录)与连接表的大小以及它们是否具有适当的索引无关。

答案 1 :(得分:0)

受影响的行数估计为1196880非常高,导致查询执行时间过长。我也试过只加入一次表,但它给出了不同的输出。

请建议除了创建索引之外的任何其他解决方案,因为我已经为表tbl_checks创建了非聚集索引,但它没有任何区别。

以下是SQl执行计划。

enter image description here