我对查询有这种奇怪的性能问题,我正在试图弄清楚为什么会发生这种情况。这是查询的简化示例:
SELECT DISTINCT table1.status AS Status
FROM table1
INNER JOIN (
SELECT DataID, MAX(VersionNum) as mVersion
FROM table1
GROUP BY DataID
) AS b
ON table1.DataID = b.DataID
AND table1.VersionNum = b.mVersion
INNER JOIN table2
ON table1.table2ID = table2.ID
WHERE table2.field = @parameter
表1由有时具有相同DataID的行组成,每个行都有一个版本号,我需要从该组行中选择最高的数字。
表1包含可用于与table2连接的特定ID。 如果我从table2添加一个约束,并且参数实际存在于table2中,则查询需要一分钟才能完成,返回10行。
如果我为table1添加约束,则不会出现任何性能问题,只需不到一秒钟即可完成。
我希望这是足够的信息,我真的很好奇为什么会发生这种情况以及如何解决它。
编辑:我必须提一下,如果删除第一个内连接(以过滤最大版本),性能下降就会消失。
答案 0 :(得分:0)
我知道分析器应该能够处理所有这些情况,但无论如何我都要问......
您是否尝试过分析以下任何内容:
WITH CTE_Versions AS ( SELECT DataID, MAX(VersionNum) as mVersion FROM t1 GROUP BY DataID ) SELECT DISTINCT t1.status AS Status FROM t1 JOIN CTE_Versions AS b ON t1.DataID = b.DataID AND t1.VersionNum = b.mVersion JOIN table2 ON t1.table2ID = table2.ID WHERE table2.field = @parameter
SELECT DISTINCT t1.status AS Status FROM t1 with (nolock) JOIN ( SELECT DataID, MAX(VersionNum) as mVersion FROM t1 with (nolock) GROUP BY DataID ) AS b ON t1.DataID = b.DataID AND t1.VersionNum = b.mVersion JOIN table2 with (nolock) ON t1.table2ID = table2.ID WHERE table2.field = @parameter
SELECT DISTINCT t1.status AS Status FROM t1 JOIN ( SELECT DataID, MAX(VersionNum) as mVersion FROM t1 GROUP BY DataID ) AS b ON t1.DataID = b.DataID AND t1.VersionNum = b.mVersion JOIN table2 ON t1.table2ID = table2.ID AND table2.field = @parameter
我有兴趣听听这三种(或其组合)会如何发展?