質問から何を意味するのかが明確でない場合に備えて、この質問の後に完全な例を示しました。
約5つのテーブルのデータを結合するビューを作成しました。テーブルには膨大な量のデータがあり、クエリの実行には時間がかかります。私の質問は、私がそうする場合:
SELECT * FROM myView WHERE PersonID = 1000
SQL Serverは「私が何を意味するのかを知っており」、その条件をビューの基になる結合に自動的に伝播しますか?すべての人に実行されるわけではありませんが、適切な段階で結果セットを最小限に抑えるようにします。それとも、すべてに対して実行さWHERE ID = 1000
れ、完全な結果セットに対して実行されますか?
例
私が言っていることを単純化するために(...うまくいけば)、これが疑似TSQLシナリオの例です:
TABLE People (
ID,
Surname,
DOB
)
TABLE Activities (
ID,
TypeID,
LocationID,
Date
)
TABLE PersonActivityInvolvements (
ID,
PersonID,
ActivityID
)
TABLE ActivityTypes (
ID,
Name
)
TABLE Locations (
ID,
Street,
City
)
People
だから私は私にすべて、Activities
彼らが関わったもの ActivityType
、そしてLocation
それが起こったことを示すビューが欲しいのです。この設定はそれほど複雑ではありませんが、各エンティティが数万と言われると、実行に非常に長い時間がかかる可能性があることがわかります。
ビューは次のようになります。
SELECT
*
FROM
People LEFT OUTER JOIN PersonActivityInvolvement PA
ON People.ID = PA.ID
INNER JOIN Activity
ON PA.ID = Activity.ID
INNER JOIN ActivityTypes AT
ON A.TypeID = AT.ID
INNER JOIN Locations
ON A.LocationID = Locations.ID
だから
SELECT * FROM myView WHERE DOB >= dateAdd(YEAR, -18, getDate())
ビュー内のクエリはすべてのユーザーに対して実行されますか、それともSQL ServerはそれをPeople.DOB
フィールドに適用する必要があることを認識しますか?