繁体   English   中英

将 OUTER APPLY 转换为 LEFT JOIN

[英]Convert OUTER APPLY to LEFT JOIN

我们有生产缓慢的查询(由于某些内部原因),

SELECT T2.Date
FROM Table1 T1
OUTER APPLY 
(
    SELECT TOP 1 T2.[DATE] 
    FROM Table2 T2 
    WHERE T1.Col1 = T2.Col1 
    AND T1.Col2 = T2.Col2 
    ORDER BY T2.[Date] DESC
) T2

但是当我转换为 LEFT JOIN 时,它变得很快,

SELECT Max(T2.[Date])
FROM Table1 T1
LEFT JOIN Table2 T2
   ON T1.Col1 = T2.Col1 
   AND T1.Col2 = T2.Col2
GROUP BY T1.Col1, T1.Col2

我们可以说两个查询是相等的吗? 如果不是,那么如何正确转换它。

查询并不完全相同。 了解这些差异很重要。

如果t1.col1 / t1.col2重复,则第一个查询为每个重复返回单独的行。 第二个将它们组合成一行。

如果t1.col1t1.col2NULL ,则第一个查询将返回NULL的最大日期。 第二个将返回一行和适当的最大值。

也就是说,这两个查询应该具有相似的性能,特别是如果您在table2(col1, col2, date)上有索引。 我应该注意到在某些情况下apply方法比join更快,因此相对性能取决于情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM