索引视图必须启用SCHEMABINDING,且SELECT列表严禁非确定性函数、*、隐式转换;唯一聚集索引键须覆盖GROUP BY列或主键及分区列;查询需字面匹配或加NOEXPAND提示才能命中。

索引视图要求 SCHEMABINDING 必须启用
不加 SCHEMABINDING 的视图根本无法创建唯一聚集索引,这是最基础的硬性门槛。SQL Server 会直接报错:Cannot create index on view 'xxx' because the view is not schema bound.
启用方式很简单,但容易漏掉:定义视图时必须显式写上 WITH SCHEMABINDING,且所有引用的对象(表、函数)都得在同一数据库中,不能跨库或用临时表。
- 引用的表名必须带两段式名称(如
dbo.Orders),不能只写Orders - 不能引用系统视图、表值函数(除非是内联 TVF 且也带
SCHEMABINDING) - 一旦启用
SCHEMABINDING,被引用的基表结构就不能随意修改(比如删列、改类型),否则会失败
SELECT 列列表有严格语法限制
索引视图的 SELECT 语句不能含任何“不确定表达式”或隐式转换,否则建索引时会拒绝 —— 这不是警告,是直接失败。
常见踩坑点包括:
- 不能用
*,所有列必须显式列出,且不能重复 - 不能用
GETDATE()、NEWID()、@@ROWCOUNT等非确定性函数 - 聚合列必须配
GROUP BY,且GROUP BY列必须全部出现在SELECT中(含聚合列) - 不能用
TEXT/NTEXT/IMAGE类型(已弃用,但仍有遗留系统撞上) - 计算列若参与索引,其定义必须是确定性的(比如
ISNULL(Price, 0)可以,LEN(Name)在某些排序规则下可能不行)
唯一聚集索引必须包含所有键列和分区列
索引视图只能有一个唯一聚集索引,且它的键必须能唯一标识每一行——这意味着它通常要包含所有参与 GROUP BY 的列(对聚合视图),或主键列(对非聚合视图)。
如果基表是分区表,视图定义里又用了分区列,那这个唯一聚集索引的键还必须包含分区列,否则会报错:The unique clustered index cannot be created because the partitioning column is not part of the key.
- 非聚合视图:推荐直接用基表主键列作为聚集索引键
- 聚合视图(如
GROUP BY CustomerID, Year):索引键必须至少是(CustomerID, Year),缺一不可 - 即使你后续想加非聚集索引,也必须先建好这个唯一聚集索引
查询必须满足“引用匹配”才能触发索引视图自动使用
建完索引视图不代表查询就自动走它——SQL Server 查询优化器默认不展开视图,除非你显式开启 NOEXPAND 提示,或者查询文本与视图定义“字面完全匹配”。
所谓匹配,是指查询的 FROM 子句直接引用视图名,且 WHERE、JOIN、SELECT 列都严格落在视图定义范围内。哪怕多一个没在视图里定义的列,或少一个 WHERE 条件,优化器就大概率绕过它。
- 安全做法:在关键查询里强制加提示
FROM SalesSummary WITH (NOEXPAND) - 避免用
SELECT *查索引视图,因为视图列顺序/数量变化会导致执行计划失效 -
ANSI_NULLS和QUOTED_IDENTIFIER连接级设置必须为ON,否则索引视图会被忽略
Index Seek/Scan 是否指向你的视图名,而不是底层基表。

















