Я следил за этим вопросом с полным примером на тот случай, если неясно, что я имею в виду под вопросом.
Я сделал представление, объединяющее данные примерно из пяти таблиц.Таблицы содержат огромное количество данных, и запросы выполняются медленно.Мой вопрос заключается в том, что если я сделаю:
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
?