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