创建索引视图的基本步骤:首先,确保视图的SELECT语句满足索引视图的要求,如使用COUNT_BIG()、GROUP BY等。然后使用CREATE VIEW创建视图,接着用CREATE UNIQUE CLUSTERED INDEX ON view_name(column)建立唯一聚集索引,最后添加非聚集索引。示例代码:CREATE VIEW dbo.MyIndexedView WITH SCHEMABINDING AS SELECT CustomerID, COUNT_BIG(*) AS cnt FROM dbo.Orders GROUP BY CustomerID; CREATE UNIQUE CLUSTERED INDEX IDX_MyIndexedView ON dbo.MyIndexedView(CustomerID); 这能显著提升聚合查询性能。
索引视图要求
要创建索引视图,视图必须使用WITH SCHEMABINDING选项,且SELECT语句只能引用基表的列,不能有子查询、浮点数、TEXT、NTEXT、IMAGE等数据类型。必须包含COUNT_BIG(*),并使用所有表的列在GROUP BY中。确定性函数是必需的,如确定性聚合函数。
优化技巧
索引视图在OLAP查询中特别有效,能将查询时间从几分钟缩短到几秒。优先在频繁执行的聚合、JOIN查询上使用。监控索引视图的使用率,通过sys.dm_db_index_usage_stats查看是否被查询优化器使用,如果不使用则考虑删除以节省维护成本。
性能提升案例
在实际项目中,为销售汇总视图创建索引后,月度报表查询从10秒降到0.1秒。注意,索引视图的更新会涉及基表的INSERT/UPDATE/DELETE,维护开销较高,适合读多写少的场景。
常见限制
索引视图不支持TOP、MINUS、UNION、OUTER JOIN等操作。基表不能有触发器或级联操作。视图中的列名必须用NOEXPAND提示来强制使用索引视图,否则优化器可能忽略。
最佳实践
1. 分析查询模式,选择高频聚合视图建索引。2. 使用Database Engine Tuning Advisor辅助推荐。3. 定期重建索引视图以保持性能。4. 测试DML操作对性能的影响。
FAQ
Q: 索引视图适合什么场景?
A: 适合读密集型、聚合和JOIN频繁的报表查询,不适合高并发DML场景。
Q: 如何检查索引视图是否被使用?
A: 查询sys.dm_db_index_usage_stats视图,查看user_seeks和user_scans列。
Q: 索引视图的维护成本高吗?
A: 是的,每次基表变更都会更新索引视图,选择写少读多的表。
Q: 可以为临时表创建索引视图吗?
A: 不可以,索引视图要求基表是持久化的用户表。