2009-03-06 28 views
0

これらの2つのクエリのパフォーマンスに違いがありますか。明らかに、SQL92に準拠するようにテーブルの値を照会するために予約する必要があるのは、パフォーマンス上の理由ですか?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 

と同じ線に沿って

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 

、これら2つのクエリ間のパフォーマンスの違いはありますか?

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

そして

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

答えて

1

参加し、パフォーマンス上の一般ルールはこれです:もし必要なユースA WHERE句LEFT/OUTER INNER// RIGHT/CROSSは、ON句を使用して最初のJOINとくださいデータをさらにフィルタリングします。これがより効率的である理由は、表のサイズです。 2つのテーブルから選択してWHERE句に結合するときは、table_size_1 * table_size_2レコードを実行し、WHERE句を適用して実際の結合を取得します。 JOINを使用する場合は、実際にレコードを制限して、一時テーブルのサイズを縮小します。すべてではないにしてもほとんどのDBMSは、WHEREでの結合よりもJOIN ONを処理するように最適化されています。

XMLデータがクエリに与える影響はわかりませんが、実際のテーブル結合では、2番目の例の方が優れています。