查询索引视图时的子句性能

时间:2014-05-28 14:36:58

标签: sql sql-server sql-server-2008-r2 indexed-view

我使用如下代码(简化)创建了一个索引视图(以节省非常耗时的聚合时间):

CREATE VIEW vCosts WITH SCHEMABINDING AS
SELECT   ProjectID
         ,YEAR(Date) AS Year
         ,SUM(Cost) AS YearlyCost
FROM     dbo.DailyAssignments
GROUP BY ProjectID
         ,YEAR(Date)

CREATE UNIQUE CLUSTERED INDEX IX_vCosts ON vCosts (Year, ProjectID)

在此视图上执行SELECT *需要一秒钟。但是,以下查询需要30秒(如果包含更多年,则会指数级更差):

SELECT *
FROM   vCosts
WHERE  Year = 2001

执行计划表明它实际上使用的是基础表而不是视图(更确切地说,它似乎使用了DailyAssignments表的聚簇主键而不是视图的索引)。视图上的SELECT *按预期使用索引。

我对其他领域没有同样的问题。以下内容还使用了视图的索引,并在不到一秒的时间内完成:

SELECT *
FROM   vCosts
WHERE  ProjectID = 1

有人能帮我理解发生了什么吗?

1 个答案:

答案 0 :(得分:4)

尝试在视图后添加WITH (NOEXPAND)。我也有这个问题。

SELECT *
FROM   vCosts WITH (NOEXPAND)
WHERE  ProjectID = 1
  

为视图指定NOEXPAND时,查询优化程序会考虑   使用视图上定义的任何索引。 NOEXPAND指定了   可选的INDEX()子句强制查询优化器使用   指定的索引。 NOEXPAND只能为索引视图指定   并且不能为未编入索引的视图指定。

来源http://technet.microsoft.com/en-us/library/ms181151(v=sql.105).aspx