我有以下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
)
)
)
答案 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
)