sql-server-2005 – 为什么在视图外部放置一个WHERE子句可能会出
发布时间:2020-12-12 16:11:55 所属栏目:MsSql教程 来源:网络整理
导读:假设你有一个看法: CREATE VIEW dbo.v_SomeJoinedTables ASSELECT a.date,a.Col1,b.Col2,DENSE_RANK() OVER(PARTITION BY a.date,a.Col2 ORDER BY a.Col3) as SomethingFROM a JOIN b on a.date = b.date 我发现表现如下: SELECT *FROM v_SomeJoinedTablesW
假设你有一个看法:
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中已经减轻了预期的工作效率 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |