SQL Server中过滤视图时是否先执行全量记录再过滤?
视图过滤的执行逻辑解析
不会默认先返回全量结果再筛选——主流数据库的查询优化器大多会把外部的过滤条件合并到视图的底层执行逻辑中,也就是常说的「谓词下推」。
拿你举的例子来说:
SELECT * FROM VW_INVOICES WHERE DATE = GETDATE()
优化器会直接把DATE = GETDATE()这个条件嵌入到视图VW_INVOICES的原始查询里,相当于直接执行带日期过滤的底层表查询,不会先把视图的全量数据查出来再做筛选。
当然也有例外情况,如果视图包含以下特殊构造,优化器可能无法做谓词下推,只能先查全量视图结果再过滤:
- 包含
DISTINCT、聚合函数(比如SUM/COUNT) - 用了
TOP/LIMIT这类限制行数的语法 - 包含
UNION/UNION ALL组合查询 - 是某些特定的不可更新视图
比如如果VW_INVOICES的定义是SELECT DISTINCT * FROM INVOICES,部分数据库的优化器可能会先执行全量去重得到视图结果,再应用DATE = GETDATE()的过滤条件。
内容的提问来源于stack exchange,提问作者ayyyran
相关产品推荐
相关产品推荐

