我已经用一个完整的例子来跟踪这个问题,以防我不清楚这个问题的意思。
我制作了一个视图,它连接了来自大约五个表的数据。这些表有大量数据,查询运行缓慢。我的问题是,如果我这样做:
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
字段?