我使用如下代码(简化)创建了一个索引视图(以节省非常耗时的聚合时间):
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
有人能帮我理解发生了什么吗?
答案 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