sql-server - SQL Server 是否在复杂 View 中传播 WHERE 条件?

标签 sql-server view sqlperformance

我在这个问题后面加上了一个完整的例子,以防我不清楚我在这个问题中的意思。

我创建了一个 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、他们参与的任何ActivitiesActivityType 的 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 通常擅长于此,尽管在某些结构中存在问题(例如,参见 this article 的最后部分)。

检查执行计划以查看应用谓词的位置。

关于sql-server - SQL Server 是否在复杂 View 中传播 WHERE 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183198/

相关文章:

sql-server - 单击单选按钮时调用脚本 block

sql - 使用 SQL Server 根据端点和不一致数据查找序列跨度

sql-server - 两个日期之间的 SQL 时间差导致 hh :mm:ss

Android,如何从 UI 中删除 View ?

SQL:在表中查找缺少的层次结构文件夹(路径)

mysql - 使用 SELECT 更新以创建排名(效率)

sql-server - 用于更新列中具有相同值的行的 T-SQL

asp.net-mvc - _ViewStart.cshtml中定义的访问函数

Android:在渲染之前测量 View 的大小

SQL 服务器 2014 : slow stored procedure execution time