我在这个问题后面加上了一个完整的例子,以防我不清楚我在这个问题中的意思。
我创建了一个 View ,它连接了大约五个表中的数据。这些表包含大量数据,查询运行速度很慢。我的问题是,如果我这样做:
SELECT * FROM myView WHERE PersonID = 1000
SQL Server 是否“知道我的意思”并自动将该条件传播到 View 中的基础连接?这样它就不会为每个人 运行,而是在正确的阶段最小化结果集。或者它会针对所有内容运行然后对完整结果集执行 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
和 的 View 地点
它发生了。虽然此设置并不十分复杂,但您可以看到,如果每个实体有数万个,则可能需要很长时间才能执行。
View 可能是这样的:
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())
View 中的查询会为每个人运行,还是 SQL Server 知道它应该将它应用到 People.DOB
字段?
最佳答案
关于sql-server - SQL Server 是否在复杂 View 中传播 WHERE 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183198/