2016-09-11 16 views
3

次のクエリを最適化しようとしていました。使用されている2つのサブクエリを1つのクエリにすることができます。次のクエリを最適化する方法

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 byアウトでTOP 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 1は、ORDER BY句なしで実行されます。上記のクエリのselect nullを、先頭行の選択を決定するフィールドに置き換えることができます。

+0

OPに 'ID'カラムのインデックスがある場合でも、' ID'のすべてのレコードをスキャンして 'Row_number'を生成すると思います –

関連する問題