2017-10-17 370 views
1

我們詢問這是在生產緩慢(對於一些內部原因),轉換OUTER APPLY到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 

能我們說這兩個查詢是平等的?如果沒有,那麼如何正確轉換它。

+0

它們並不相同,因爲您的第一個查詢語法無效 - 但也許您的模糊嘗試引入了錯誤。您引用A.DATE,但別名A未定義。 – SMor

+0

@SMor是的,我現在糾正。它是平等的嗎? – user960567

+0

此外,建議的邏輯似乎依賴於一些假設。假設邏輯類似,使用聚合應該減少返回的行數。基於可用的數據,這只是運氣,你似乎認爲這些是相同的?你是否嘗試過並比較結果? – SMor

回答

1

查詢不完全相同。理解差異很重要。

如果t1.col1/t1.col2是重複的,則第一個查詢將爲每個重複返回一個單獨的行。第二個將它們組合成一行。

如果t1.col1t1.col2NULL,則第一個查詢將返回最大日期的NULL。第二行將返回一行和適當的最大值。

也就是說,這兩個查詢應該有類似的表現,特別是如果你有一個索引table2(col1, col2, date)。我應該注意到,在某些情況下,apply方法比join更快,所以相對性能取決於環境。

+0

謝謝。在我的情況下,我確信T1.Col1,T1.Col2是唯一的,不能爲空:) – user960567