必须先用with schemabinding创建视图并满足两段式表名、禁用非确定性函数等硬性要求,再创建唯一聚集索引;否则必然报“view is not schema bound”错误。

CREATE VIEW 必须带 WITH SCHEMABINDING
不加 WITH SCHEMABINDING 就别想建索引——SQL Server 直接拒绝后续所有操作。这不是可选修饰,是硬性前置条件。
- 漏写会报错:
The view definition is not valid for use with indexed views. - 写了但引用表没用两段式名称(比如写
Employees而不是dbo.Employees),一样失败 - SSMS 图形界面新建视图时默认不加该选项,也不补全 schema,必须手动改脚本
- 视图里不能出现
SELECT *、TOP、GETDATE()、NEWID()、@@SPID等非确定性表达式 - 不能引用临时表、表变量、跨库对象(如
OtherDB.dbo.Table)
CREATE UNIQUE CLUSTERED INDEX 必须是第一个索引
先建非聚集索引?那唯一聚集索引就永远建不上了。SQL Server 强制要求:视图上第一个索引只能是 CREATE UNIQUE CLUSTERED INDEX。
- 已有非聚集索引时,得先
DROP INDEX,再建唯一聚集索引 - 错误信息典型是:
The operation failed because an index exists on the view. - 聚集索引列必须能构成唯一键——通常是基表主键或带
UNIQUE约束的列组合 - 如果是计算列,必须同时满足三条件:
is_deterministic = 1、is_precise = 1、is_persisted = 1 - 不能用
text/ntext/image类型,也不能是可能溢出的varchar列(ROW_OVERFLOW_DATA)
SET 选项不一致会让索引视图彻底失效
哪怕视图和索引都成功创建了,只要查询时会话的 SET 选项不匹配,优化器就完全无视这个索引——不报错、不警告、只默默退回到普通视图逻辑。
- 关键选项必须全为
ON:ANSI_NULLS、QUOTED_IDENTIFIER、ARITHABORT、CONCAT_NULL_YIELDS_NULL、NUMERIC_ROUNDABORT、ANSI_WARNINGS - 这些设置不仅影响当前会话,还必须与所有被引用基表创建时的 SET 设置一致
- 可用
SELECT OBJECTPROPERTY(OBJECT_ID('MyView'), 'ExecIsAnsiNullsOn')检查视图是否满足ANSI_NULLS ON - ODBC/OLE DB 默认值可能和 SSMS 不同,应用连接字符串里要显式指定
索引视图的 DML 开销藏在基表更新里
建索引时看不出性能代价,真正踩坑在日常写入:一旦基表有大量 INSERT/UPDATE/DELETE,所有依赖它的索引视图都会同步更新,DML 延迟可能翻几倍甚至超时。
- 不是“查得快就行”,得测真实业务场景下的写入吞吐和延迟
- 如果一个表被多个复杂索引视图引用,DML 可能直接卡住或无法生成执行计划
-
CREATE INDEX不支持ONLINE = ON对索引视图的初始唯一聚集索引——建的时候就得停写 - 维护成本随视图复杂度和引用深度指数上升,简单聚合还好,多层嵌套 JOIN + GROUP BY 就很危险











