3

私は現在、他の誰かの SQL を維持していますが、ストアド プロシージャでこれに遭遇しました。

    SELECT      
    Location.ID, 
    Location.Location, 
    COUNT(Person.ID) As CountAdultMales
FROM        
    Transactions INNER JOIN 
    Location ON Transactions.FKLocationID = Location.ID INNER JOIN  
    Person ON Transactions.FKPersonID = Person.ID 
     AND DATEDIFF(YEAR, Person.DateOfBirth, GETDATE()) >= 18 AND Person.Gender = 1
WHERE
    ((Transactions.Deleted = 0) AND
    (Person.Deleted = 0) AND
    (Location.Deleted = 0))

上記とこれの間に違いはありますか(これは私が書く方法です)

SELECT      
    Location.ID, 
    Location.Location, 
    COUNT(Person.ID) As CountAdultMales
FROM        
    Transactions INNER JOIN 
    Location ON Transactions.FKLocationID = Location.ID INNER JOIN  
    Person ON Transactions.FKPersonID = Person.ID
WHERE
    ((Transactions.Deleted = 0) AND
    (Person.Deleted = 0) AND
    (Location.Deleted = 0) AND
    (DATEDIFF(YEAR, Person.DateOfBirth, GETDATE()) >= 18) AND
    (Person.Gender = 1))

個人的には、条件をWHERE句に入れるのが最も読みやすいと思いますが、JOINを「条件付きにする」(そのような単語がある場合)パフォーマンスまたはその他の理由があるかどうか疑問に思いました

ありがとう

4

5 に答える 5

3

inner joinSQLにはクエリオプティマイザーがあり、最も効率的な方法で(完全ではない)クエリを実行するために最善を尽くすため、これは実際には大きな違いはありません。

これがouter join違いを生む可能性がある場合は、注意が必要です

于 2013-07-23T10:41:21.857 に答える
3

両方のクエリのパフォーマンスは同じです。内部結合に違いはありません。

于 2013-07-23T10:44:45.183 に答える
2

あなたの例ではパフォーマンスは同じですが、次の方法で調整できます。

SELECT      
Location.ID, 
Location.Location, 
COUNT(Person.ID) As CountAdultMales
FROM        
Transactions 
INNER JOIN Location 
ON Transactions.FKLocationID = Location.ID 
INNER JOIN Person 
ON Transactions.FKPersonID = Person.ID 
WHERE
Transactions.Deleted = 0 AND
Person.Deleted = 0 AND
Location.Deleted = 0 AND 
Person.DateOfBirth < dateadd(year, datediff(year, 0, getdate())-17, 0) AND 
Person.Gender = 1

この方法では、年を取得するためにすべての列で計算を行うわけではありません。代わりに、年を静的な値と比較するだけで、はるかに高速になります。

このクエリは、今年が終わる前に 18 歳になる (またはそれ以上になる) 行を選択しています。

于 2013-07-23T10:52:16.950 に答える
2

SO メンバーが既に述べたように、ここで実行計画について心配する必要はありません。同じ実行計画を生成する必要があります。質問自体については以上です。

コードの可読性と維持について心配する必要があります。

それは本当に結合基準またはフィルターである必要がありますか? コード自体を見るだけで、それはフィルターの一部だと思います。

于 2013-07-23T10:55:35.427 に答える
1

使用しているDBによって異なります。一般に、DB 内部オプティマイザーがこれを整理します。

こちらをご覧ください: INNER JOIN ON と WHERE 句

于 2013-07-23T10:41:40.980 に答える