SqlServer2008实例38索引视图之创建索引视图

    视图并不比定义它的底层SELECT查询更有效。然而,一个可以提升经常被访问的视图性能的方法就是为之添加索引。要这么做,必须先在视图上创建一个唯一的聚集索引。一旦视图上的索引被创建,用于物化视图的数据就像表的聚集索引那样保存。在视图上创建了唯一的聚集索引之后,你还可以创建另外的非聚集索引。基础表不会受到这些视图索引创建的影响,因为它们是独立的基础对象。
    索引视图能在任何版本的SQL Server中创建,但是只有SQL Server企业版的查询优化器能自动在查询执行计划中考虑使用索引视图。在SQL Server企业版中,如果查询优化器觉得索引视图有用,即使SQL语句显示引用了视图的底层基础表而不足视图本身,查询优化器也会自动使用它。对于企业版之外的版本,可以通过使用NOEXPAND表提示手动强制查询优化器使用索引视图。
    索引视图对于跨多行聚合数据的视图定义来说特别理想,因为聚合值能保持是最新的和物化的,可以直接查询而不用重新计算。索引视图对频繁引用更新的基础表的查询来说也很理想,但是在变化非常快的表上创建它们可能会由于要不断更新索引而导致性能下降。更新非常频繁的基础表会引起视图的索引频繁更新,也就是说更新速度要以查询性能为代价。

         首先,会新建一个视图,然后再为它创建索引(聚集和非聚集)。要创建索引视图,需要使用新的WITH SCHEMABINDING选项,它绑定视图到基础表的架构上。这样会阻止在基础表上进行的、对视图定义有影响的任何修改操作。WITH CHEMABINDING选项也为视图的查询定义增加了额外的需求。架构绑定视图中引用的对象必须包含两部分的schema.object命名规则,并且所有引用的对象必须处于同一个数据库中。

1.使用SCHEMABINDING选项创建新的视图:

USE AdventureWorks
GO

CREATE VIEW v_Product_Sales_By_Linetotal
WITH SCHEMABINDING
AS

SELECT p.ProductID,p.Name ProductName,
	   SUM(LineTotal) LineTotalByProduct,
	   COUNT_BIG(*) LineItems
FROM Sales.SalesOrderDetail s 
INNER JOIN Production.product p ON
      s.ProductID=p.ProductID
GROUP BY p.ProductID,p.Name
GO      
     

2.    在创建索引之前,查询普通视图,使用SET STATISTICS IO命令来返回I/O成本的统计信息:

USE AdventureWorks
GO

SET STATISTICS IO ON
GO

SELECT TOP 5 ProductName,LineTotalByProduct
FROM v_Product_Sales_By_Linetotal
ORDER BY LineTotalByProduct DESC

SqlServer2008实例38索引视图之创建索引视图_第1张图片

    它返回了I/O信息,汇总了视图中使用的底层基础表的各种扫描行为:

3.在普通视图上根据ProductID视图列的唯一值创建一个聚集索引:

USE AdventureWorks
GO

CREATE UNIQUE CLUSTERED INDEX UCI_v_Product_Sales_By_LineTotal
ON v_Product_Sales_BY_LineTotal(ProductID)
GO

4.  然后就可以开始根据需要创建非聚集索引:

USE AdventureWorks
GO

CREATE NONCLUSTERED INDEX NI_v_Product_Sales_By_LineTotal
ON v_Product_Sales_By_LineTotal(ProductName)
GO

5.把前面在普通视图上执行的查询在索引视图上再执行一次:

USE AdventureWorks
GO

SET STATISTICS IO ON
GO

SELECT TOP 5 ProductName,LineTotalByProduct
FROM v_Product_Sales_By_Linetotal
ORDER BY LineTotalByProduct DESC

    这个查询返回了和先前一样的结果,只是这次的I/O行为不同。以前是访问了两个基础表和一个工作表(用来临时处理结果的tempdb),这次只访问了一个对象来获取结果:


       索引视图允许我们把视图的结果物化成一个物理对象,和普通表以及相关的索引相似。它允许SQL Server查询优化器从单独的物理区域获取数据,而不用每次调用的时候处理视图定义查询。

    一旦视图被索引了,只要视图或者基础表被查询引用,SQL Server企业版就能使用视网索引。使用SET STATISTICS IO命令来演示SQL Server在视图索引前后如何进行数据页获取。
    索引视图对于相对静态的数据能提供更好的性能。从另外一面来说,经常更新的基础表不适合被索引视图引用,因为更新同样会引起视图索引的频繁更新,从而潜在地减少查询性能上的获益。这是数据修改速度和查询速度的折中。
    尽管索引视图能使用任何版本的SQL Server创建,但如果使用企业版的话,它们会在查询中自动被考虑使用。要确保其他版本的SQL Server使用,你需要使用视图提示NOEXPAND。



 

你可能感兴趣的:(#,SqlServer2008实例)