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