2017-10-17 25 views
1

Nous avons requête qui est lente dans la production (pour une raison interne),Convertir 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 

Mais quand je convertir à LEFT JOIN il devient rapide,

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 

Peut nous disons que les deux requêtes sont égales? Si non alors comment le convertir correctement.

+0

Ils ne sont pas égaux car votre première requête n'est pas une syntaxe valide - mais votre tentative d'obfuscation a peut-être introduit une erreur. Vous faites référence à A.DATE mais l'alias A n'est pas défini. – SMor

+0

@SMor oui j'ai corrigé maintenant. Est-ce égal? – user960567

+0

En outre, la logique suggérée semble s'appuyer sur certaines hypothèses. L'utilisation d'un agrégat devrait réduire le nombre de lignes renvoyées en supposant que la logique est analogue. Est-ce juste de la chance basée sur les données disponibles que vous semblez penser que ce sont les mêmes? Avez-vous essayé et comparez les résultats? – SMor

Répondre

1

Les requêtes ne sont pas exactement les mêmes. Il est important de comprendre les différences. Si t1.col1/t1.col2 sont dupliquées, la première requête renvoie une ligne distincte pour chaque duplication. La seconde les combine en une seule rangée.

Si t1.col1 ou t1.col2 sont NULL, la première requête renverra NULL pour la date maximale. Le second retournera une ligne et le maximum approprié. Cela dit, les deux requêtes devraient avoir des performances similaires, en particulier si vous avez un index sur table2(col1, col2, date). Je devrais noter que dans certaines circonstances, la méthode apply est plus rapide que join s, donc la performance relative dépend des circonstances.

+0

merci. Dans mon cas je suis sûr que T1.Col1, T1.Col2 sont uniques et non nullables :) – user960567