将OUTER APPLY转换为LEFT JOIN

时间:2017-10-17 14:54:02

标签: sql sql-server sql-server-2014

我们的查询生产缓慢(出于某种内部原因),

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

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

1 个答案:

答案 0 :(得分:1)

查询不完全相同。了解差异非常重要。

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

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

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

相关问题