我试图优化以下查询。正在使用的两个子查询可以将其转换为单个查询。

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 专家,对于以下要优化的查询,可能的最佳解决方案是什么。任何帮助是极大的赞赏。

最佳答案

使用 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 你会在 result 中得到任意记录。

关于sql - 如何优化以下查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39433603/

10-13 09:45