SQL Server索引 - 索引(物化)视图 <第九篇>

1、索引视图基本概念

  索引视图其实是一种将一组惟一值“物化”为群集索引形式的视图,所为物化就是几乎和表同样,其数据也是会存储一份的(会占用硬盘空间,可是查询速度快,例如能够将count(),sum()等值设在索引视图中)。其优势是它在提取视图背后的信息方面提供了一个很是快的查找方法。在第一个索引(必须是针对一组惟一值的汇集索引)以后,经过使用来自第一个索引的汇集键做为参考点,SQL Server还能在视图上创建额外的索引。其限制以下:数据库

  1. 视图必须使用SCHEMABINDING选项;
  2. 若是视图引用了任何用户自定义函数,那么这些函数也必须是模式绑定的;
  3. 视图不能够引用任何其余的视图-只能引用表和UDF;
  4. 在视图中引用的全部表和UDF必须采用两部分的命名约定(例如:dbo..Customers),而且也必须具备和视图相同的全部者;
  5. 视图和视图引用的全部对象必须在相同的数据库中;
  6. 在建立视图和全部底层表时,必须打开ANSI_NULLS以及QUOTED_IDENTIFIER选项;
  7. 视图引用的任何函数必须是肯定的;

   示例:函数

  CREATE VIEW CustomerOrders_vw
  WITH SCHEMABINDING
  AS
  SELECT ....

  当建立索引时,在视图上建立的第一个索引必须是汇集的和惟一的:工具

  CREATE UNIQUE CLUSTERED INDEX ivCustomerOrders
  ON CustomerOrders_vw(AccountNumber,SalesOrderID,ProductID)

  一旦执行该命令,就有了视图的群集索引。索引基本和表的同样,也须要维护成本。post

2、索引视图做用示例

  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语句的执行速度减慢多少?这必须考虑进去,这是个平衡问题,要视每一个表和每一个索引而定。尽管如此,索引视图仍是一种较强大的工具,所以做仔细地权衡。

相关文章
相关标签/搜索