SQL2005视图(八)--视图索引

一个没有任何索引的视图不需要任何存储空间。当一个语句使用它的时候,SQL Server会将视图的定义与语句合并,并对其进行优化,生成有关执行计划并获取数据。在视图处理或 联接很多行的时候,这个过程的开销会很大。在这种情况下,如果视图经常被请求,那么对其进行索引可以大大提高查询性能。
当视图被索引的时候,会像一个聚集索引的表一样被处理并且其索引结果会存在一个数据文件中。在基表数据发生更改的时候,SQL Server会自动维护这个索引。视图索引会显著提高对视图数据的访问速度,但在基表数据发生变化的时候,维护视图上的索引会增加额外的开销,这是肯定的。因此,在视图处理多行数据或与聚合函数同时使用的时候,或者在基表中的数据并不经常改变的时候可以考虑使用索引视图。
在SQL Server 2005 Enterprise,Developer或Evaluation Edition中,索引视图可以加速没有直接引用视图的查询。例如,如果要处理的查询包括一个聚合函数,SQL Server优化器发现一个索引视图已经包含这个聚合,就会从索引获取聚合结果而不必重新计算它。
可以通过以下步骤创建一个索引视图。
Ø        创建一个索引视图
1.    使用SCHEMABINDING子句来创建一个视图。这个视图必须符合许多要求。例如,它只能引用同一数据库中的基表。所有引用的函数必须是确定性的;行集函数、派生表和子查询都不能在索引视图中使用。创建索引视图的完整要求列表可以在SQL Server Books Online 的主题“Creating Indexed Views”中找到。
2.    在视图上创建一个 惟一索引。这个索引的叶子级由视图的完整结果集组成。
3.    在聚集索引的基础上根据需求创建非聚集索引。非聚集索引可以按平常的方式创建。
Ø        创建并使用索引视图
1.    打开SQL Server Management Studio。打开“新建查询”窗口并更改数据库上下文为“ AdventureWorks”。
2.    键入并执行以下语句创建一个视图以通过分组订单的月份来聚合 LineTotal。此示例的代码包含在示例文件CreatingAndUsingIndexedViews.sq l中。
 
CREATE VIEW dbo.vOrderDetails
     WITH SCHEMABINDING
AS
     SELECT DATEPART(yy, Orderdate) as Year,
         DATEPART(mm, Orderdate) as Month,
         SUM( LineTotal) as OrderTotal,
          COUNT_BIG(*) as LineCount
     FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
         ON o. SalesOrderID = od.SalesOrderID
     GROUP BY DATEPART(yy, Orderdate),
         DATEPART(mm, Orderdate)
 
3.    键入并执行以下SELECT语句。在“信息”选项卡中可以看到SQL Server在执行此语句的过程中需要进行几乎1000次的页读操作。
 
SET STATISTICS IO ON
SELECT Year, Month, OrderTotal
    FROM dbo.vOrderDetails
    ORDER BY YEAR, MONTH
SET STATISTICS IO OFF
 
4.    键入并执行以下CREATE INDEX语句在 vOrderDetails视图创建一个惟一聚集索引。
 
CREATE UNIQUE CLUSTERED INDEX CLIDX_ vOrderDetails_Year_Month
ON dbo.vOrderDetails(Year,Month)
 
5.    执行以下SELECT语句。注意,由于结果数据已经被计算并存储在索引中,因此SQL Server现在只需要进行两次页读操作。
 
SET STATISTICS IO ON
SELECT Year, Month, OrderTotal
     FROM dbo.vOrderDetails
     ORDER BY YEAR, MONTH
SET STATISTICS IO OFF
 
6.    如果安装的是SQL Server 2005 Enterprise,Developer或Evaluation版,键入并执行以下这个没有引用视图的SELECT语句,然后按“Ctrl+L”来查看估计的执行计划,如图6.15所示。
SELECT DATEPART(yy, Orderdate) as Year,
         SUM( LineTotal) as YearTotal
     FROM dbo.Orders o INNER JOIN dbo.OrderDetails od
         ON o. SalesOrderID = od.SalesOrderID
     GROUP BY DATEPART(yy,Orderdate )
 
图6.15  查看估计的执行计划
7.    以上查询计划表明,SQL Server对视图使用聚集索引来获取数据。因为这样可以更加高效地通过合计视图中找到的月聚合来创建 YearTotal聚合。因此可以看出,现在的索引视图可以在不记录查询本身的情况下提高查询速度。
8.    关闭SQL Server Management Studio。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值