创建索引视图前必须满足:ANSI_NULLS和QUOTED_IDENTIFIER为ON;视图定义不含非确定性函数、子查询、TOP等;聚合必须含COUNT_BIG(*);基表名用两段式。
SQL Server 里创建索引视图前必须满足哪些条件
索引视图不是所有查询都能套用,SQL Server 对它有一套硬性约束,不满足就建不了唯一聚集索引,也就谈不上加速。最常卡住的地方是 SET 选项和视图定义本身。
-
ANSI_NULLS、QUOTED_IDENTIFIER必须为 ON(连接级和创建时都得开) - 视图不能含
GETDATE()、NEWID()、子查询、TOP、UNION、OUTER JOIN、NOT IN等非确定性或复杂结构 - 聚合必须包含
COUNT_BIG(*)(哪怕你只想要COUNT(*)),否则无法建唯一聚集索引 - 基表名必须用两段式写法(如
dbo.Sales),不能用别名或三段式
如何写一个能被索引的聚合视图
核心是让 SQL Server 能把聚合结果固化成物理存储。关键动作是:先建视图,再加 WITH SCHEMABINDING,最后在视图上建唯一聚集索引。
CREATE VIEW dbo.v_SalesSummary
WITH SCHEMABINDING
AS
SELECT
ProductID,
SUM(Quantity) AS TotalQty,
COUNT_BIG(*) AS RowCnt -- 必须有,不可省略
FROM dbo.Sales
GROUP BY ProductID;
接着执行:
CREATE UNIQUE CLUSTERED INDEX IX_v_SalesSummary_ProductID ON dbo.v_SalesSummary (ProductID);
注意:ProductID 必须是 GROUP BY 中的列,且整个组合要能唯一标识每行——否则建索引会失败。
为什么查询没走索引视图,反而变慢了
即使视图建好了,SQL Server 默认也不一定用它。常见原因有: