为什么在视图外部放置WHERE子句会产生糟糕的性能

bpe*_*kes 16 t-sql sql-server-2005 where-clause sql-execution-plan

假设您有一个观点:

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
Run Code Online (Sandbox Code Playgroud)

我发现了以下的表现:

SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
Run Code Online (Sandbox Code Playgroud)

比...差很多

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'
Run Code Online (Sandbox Code Playgroud)

我很惊讶这两个语句的查询计划不一样.

我也尝试使用内联表值函数,但查询仍然比我复制和粘贴视图逻辑的代码长100-1000倍.

有任何想法吗?

gbn*_*gbn 16

它被称为" Predicate推 ",也称为延迟过滤.

SQL Server并不总是能够有效地在视图内部"更早地"实现WHERE.

它在SQL Server 2008中得到了缓解,可以按预期工作

  • 不确定这个。我遇到了与 SQL Server 2008 R2 几乎相同的场景的问题。 (2认同)