假设你有一个看法:
CREATE VIEW dbo.v_SomeJoinedTables AS SELECT a.date,a.Col1,b.Col2,DENSE_RANK() OVER(PARTITION BY a.date,a.Col2 ORDER BY a.Col3) as Something FROM a JOIN b on a.date = b.date
我发现表现如下:
SELECT * FROM v_SomeJoinedTables WHERE date > '2011-01-01'
比差得多
SELECT *,DENSE_RANK() OVER(PARTITION BY a.date,a.Col2 ORDER BY a.Col3) as Something FROM a JOIN b ON a.date = b.date WHERE a.date > '2011-01-01'
我非常惊讶,这两个语句的查询计划是不一样的.
我也尝试使用内联表值函数,但查询仍然比我复制和粘贴视图逻辑的代码长100-1000倍.
有任何想法吗?
解决方法
它被称为“
Predicate pushing”又称延迟过滤.
sql Server并不总是能够有效地在视图内部实现“早期”应用的WHERE.
在sql Server 2008中已经减轻了预期的工作效率