加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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中已经减轻了预期的工作效率

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读