检查查询效率

时间:2014-11-24 21:49:48

标签: sql sql-server-2008

我有以下SQL查询,我想知道我是否可以使用临时表或其他东西来改进它或者这是否足够好?所以基本上我只是将内部查询的结果集提供给外部查询。

SELECT S.SolutionID
    ,S.SolutionName
    ,S.Enabled
FROM dbo.Solution S
WHERE s.SolutionID IN (
        SELECT DISTINCT sf.SolutionID
        FROM dbo.SolutionToFeature sf
        WHERE sf.SolutionToFeatureID IN (
                SELECT sfg.SolutionToFeatureID
                FROM dbo.SolutionFeatureToUsergroup SFG
                WHERE sfg.UsergroupID IN (
                        SELECT UG.UsergroupID
                        FROM dbo.Usergroup UG
                        WHERE ug.SiteID = @SiteID
                        )
                )
        )

1 个答案:

答案 0 :(得分:3)

它在很大程度上取决于你对这些表的索引。由于您只是从Solution表中选择数据,因此可以将其他所有内容放在exists子句中,进行一些正确的连接,并且它应该表现得更好。

exists子句允许您删除SolutionToFeature表上的不同内容。 Distinct会导致性能下降,因为它基本上是在幕后创建一个临时表来比较记录是否对结果集的其余部分是唯一的。随着你的桌子的成长,你会受到很大的打击。

它看起来与我下面的内容类似,但没有样本数据或任何我无法判断它是否完全正确。

Select S.SolutionID, S.SolutionName, S.Enabled
From dbo.Solutin S
Where Exists    ( 
                select 1 
                from dbo.SolutionToFeature sf
                Inner Join dbo.SolutionToFeatureTousergroup SFG on sf.SolutionToFeatureID = SFG.SolutionToFeatureID
                Inner Join dbo.UserGroup UG on sfg.UserGroupID = UG.UserGroupID
                Where S.SolutionID = sf.SolutionID
                and UG.SiteID = @SiteID
                )