我在连接表时从获取大量记录时遇到问题。请参阅以下查询:
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分钟)。
请建议一个解决方案来调整此查询,因为它在前端抛出错误
答案 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执行计划。