sql-server-2005 – 为什么在视图外部放置一个WHERE子句可能会出现糟糕的表现

前端之家收集整理的这篇文章主要介绍了sql-server-2005 – 为什么在视图外部放置一个WHERE子句可能会出现糟糕的表现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设你有一个看法:
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中已经减轻了预期的工作效率

猜你在找的MsSQL相关文章