2014-11-24 4 views
0

임시 테이블 또는 다른 것을 사용하여 성능을 향상시킬 수 있는지 여부에 대한 의견을 얻으려는 아래 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 
         ) 
       ) 
     ) 

답변

3

이는 테이블에있는 색인에 크게 의존합니다. 솔루션 테이블에서 데이터 만 선택하기 때문에 다른 모든 항목을 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 
       ) 
+0

자사의은에 – user505210

+0

제거 ''에 '근처의 구문이 잘못 말을 S.SolutionID = sf.SolutionID에 나에게 dbo.SolutionToFeature 김포에서이 라인에 구문 오류를 보여주는 S.SolutionID = sf.SolutionID' 그것은해야 작업. – ppalms

+0

글쎄 내 원래 쿼리 나에게 218 행을 제공 하고이 새로운 쿼리는 나를 33 – user505210

관련 문제