索引视图其实是一种将一组惟一值“物化”为群集索引形式的视图,所为物化就是几乎和表同样,其数据也是会存储一份的(会占用硬盘空间,可是查询速度快,例如能够将count(),sum()等值设在索引视图中)。其优势是它在提取视图背后的信息方面提供了一个很是快的查找方法。在第一个索引(必须是针对一组惟一值的汇集索引)以后,经过使用来自第一个索引的汇集键做为参考点,SQL Server还能在视图上创建额外的索引。其限制以下:数据库
示例:函数
CREATE VIEW CustomerOrders_vw WITH SCHEMABINDING AS SELECT ....
当建立索引时,在视图上建立的第一个索引必须是汇集的和惟一的:工具
CREATE UNIQUE CLUSTERED INDEX ivCustomerOrders ON CustomerOrders_vw(AccountNumber,SalesOrderID,ProductID)
一旦执行该命令,就有了视图的群集索引。索引基本和表的同样,也须要维护成本。post
PersonTenMillion是一张一千万记录的表,下面咱们来执行以下SQL语句:优化
SELECT Age,COUNT(Age) FROM PersonTenMillion GROUP BY Age ORDER BY Age
对一张1千万记录的表进行分组计算每一个年龄的认输,你能够想象到须要花费的时间了。spa
1分31秒,这种查询语句若是在网页上面,页面已经显示页面没法响应了。code
下面咱们来优化上面这个查询,咱们建立一个索引视图以下:对象
--建立模式绑定视图 CREATE VIEW PersonAge_vw WITH SCHEMABINDING AS SELECT Age,COUNT_BIG(*) AS CountAge FROM dbo.PersonTenMillion GROUP BY Age --为视图建立索引 CREATE UNIQUE CLUSTERED INDEX ivPersonAge ON PersonAge_vw(Age)
此次咱们从索引视图上获取数据:blog
SELECT * FROM PersonAge_vw
此次是瞬间出来的,由于只是至关于从一个81行的表中使用汇集索引分那会81行数据:索引
查询速度快了好多好多,但这觉得这索引视图是好的选择吗?不是的,这只意味着它多是。和任何索引同样,须要记住索引的维护成本。维护该索引将会使对底层表的INSERT、UPDATE和DELETE语句的执行速度减慢多少?这必须考虑进去,这是个平衡问题,要视每一个表和每一个索引而定。尽管如此,索引视图仍是一种较强大的工具,所以做仔细地权衡。