2009-03-06 13 views
0

Gibt es einen Leistungsunterschied zwischen diesen beiden Abfragen. Anscheinend sollte WHERE reserviert werden, um Werte in der Tabelle als SQL 92-kompatibel abzufragen. Gibt es einen Leistungsgrund?SQL-Optimierung

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 

und

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 

In der gleichen Richtung, gibt es einen Performance-Unterschied zwischen diesen beiden Fragen?

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

Und

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

Antwort

1

Im Allgemeinen sind die Regeln für die Verbindungs- und Performance dies: Ist die Innen/Außen/links/rechts/CROSS JOIN zuerst die ON-Klausel verwenden und dann bei Bedarf Verwendung einer WHERE-Klausel um die Daten weiter zu filtern. Der Grund dafür ist die Tabellengröße. Wenn Sie aus zwei Tabellen auswählen und der WHERE-Klausel beitreten, führen Sie table_size_1 * table_size_2-Datensätze aus, und anschließend wird die WHERE-Klausel angewendet, um den tatsächlichen Join abzurufen. Wenn Sie einen JOIN verwenden, begrenzen Sie die Datensätze zuerst und reduzieren so die Größe Ihrer temporären Tabelle. Die meisten, wenn nicht alle DBMSes sind optimiert, um den JOIN ON über den Beitritt in WHERE zu behandeln.

Ich bin mir nicht sicher, welchen Effekt die XML-Daten auf die Abfrage haben, aber auf der tatsächlichen Tabellenverbindung sind beide Ihrer zweiten Beispiele besser.