2016-09-11 66 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' 

我已經使用CWE,因爲它被執行一遍又一遍每次迭代的,但我想在這裏問一些DBA專家,有什麼事情是可能的和最佳的解決方案進行優化,下面的查詢加入子查詢。任何幫助是極大的讚賞。

回答

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' 

注:您正在使用TOP 1用了Order by你會得到結果記錄隨心所欲。

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 1沒有ORDER BY條款執行,因此目前尚不清楚該記錄應選擇。您可以將上述查詢中的select null替換爲確定首行選擇的字段。

+0

如果OP在'ID'列有索引,我認爲它會掃描每個'ID'的所有記錄以生成'Row_number' –