2016-09-11 5 views
3

다음 쿼리를 최적화하려고했습니다. 사용되는 두 개의 하위 쿼리를 단일 쿼리로 만들 수 있습니다.다음 쿼리를 최적화하는 방법

select fn.id, 
(select top 1 s.rid from find f join status s on f.fid = s.fid 
        where f.fid = fn.id and f.active = 1) as rid, 
(select top 1 f.gid from find f 
        where f.fid = fn.id and f.active = 1) as gid 
      from finding fn where f.tid = 'abcd' 

나는 그것이 각각의 반복에 대해 반복해서 실행됩니다하지만 난 다음 쿼리를 최적화 할 수 있도록 가능한 최적의 솔루션이 될 수 있는지, 여기에 몇 가지 DBA 전문가에게 물어 원하기 때문에 하위 쿼리를 조인 CWE을 사용했다. 어떤 도움이라도 대단히 감사합니다.

답변

2

사용 OUTER APPLY

SELECT fn.id, 
     oa.rid, 
     oa.gid 
FROM finding fn 
     OUTER apply (SELECT TOP 1 s.rid, 
           f.gid 
        FROM find f 
          JOIN status s 
          ON f.fid = s.fid 
        WHERE f.fid = fn.id 
          AND f.active = 1) oa 
WHERE f.tid = 'abcd' 

참고 : 당신은 결과에 임의의 기록을 얻을 것이다 밖으로 Order byTOP 1을 사용하고 있습니다.

0

이 더 잘 수행해야합니다 : 선택해야하는 기록 명확하지 않다, 그래서

select fn.id, t.rid, t.gid 
from finding fn 
join (
    select f.fid, s.rid, f.gid, 
      row_number() over (order by select null) as rn 
    from find f 
    join status s on f.fid = s.fid 
    where f.active = 1 
) as t on t.fid = fn.id and rn = 1 
where fn.tid = 'abcd' 

원래 쿼리의 TOP 1ORDER BY 절없이 실행됩니다. 위 쿼리의 select null을 맨 위 행 선택을 결정하는 필드로 바꿀 수 있습니다.

+0

OP에'ID' 열에 색인이있는 경우에도 여전히'Row_number'를 생성하는 각 ID에 대한 모든 레코드를 검색 할 것입니다. –