2009-03-06 5 views
0

Y at-il une différence de performances entre ces deux requêtes? Apparemment, où devrait être réservé pour interroger les valeurs sur la table pour être conforme à la norme SQL 92, y at-il une raison de performance?Optimisation SQL

SELECT 
    Foo.FooId 
    (
    SELECT 
     Bar.BarId 
    FROM 
     Bar 
    WHERE 
     Bar.FooId = Foo.FooId 
    FOR XML PATH('Bar'), TYPE 
) As 'Bar' 
    FROM 
    Foo 
    FOR XML PATH('Foo'), TYPE 

et

SELECT 
    Foo.FooId 
    (
    SELECT 
     Bar.BarId 
    FROM 
     Bar 
    JOIN 
     Foo 
    ON 
     Foo.FooId = Bar.FooId 
    FOR XML PATH('Bar'), TYPE 
) As 'Bar' 
    FROM 
    Foo 
    FOR XML PATH('Foo'), TYPE 

Dans le même sens, est-il une différence de performance entre ces deux questions?

SELECT 
    Foo.FooId 
FROM 
    Foo 
WHERE 
    Foo.FooId IN 
    (
    SELECT 
     Bar.FooId 
    FROM 
     Bar 
    WHERE 
     Bar.SomeField = 'SomeValue' 
) 

Et

SELECT 
    Foo.FooId 
FROM 
    Foo 
JOIN 
    Bar 
ON 
    Bar.FooId = Bar.BarId 
WHERE 
    Bar.SomeField = 'SomeValue' 

Répondre

1

En général, les règles relatives à l'assemblage et la performance est la suivante: Faites la INNER/extérieur/GAUCHE/DROITE/CROSS JOIN en utilisant d'abord la clause ON et si on utilise une nécessaire clause WHERE pour filtrer davantage les données. La raison pour laquelle cela est plus efficace est la taille de la table. Lorsque vous sélectionnez deux tables et que vous joignez la clause WHERE, vous effectuez des enregistrements table_size_1 * table_size_2, puis la clause WHERE est appliquée pour obtenir la jointure réelle. Lorsque vous utilisez un JOIN, vous limitez d'abord les enregistrements, réduisant ainsi la taille de votre table temporaire. La plupart sinon tous les SGBD sont optimisés pour gérer le JOIN sur la jonction sur WHERE. Je ne suis pas sûr de l'effet que les données XML ont sur la requête, mais sur la table elle-même, vos deuxièmes exemples sont meilleurs.