当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server用索引视图查看性能状况

MSSQL
SQL语句技巧:按月统计数据
分页 SQLServer存储过程
SQL语句的基本语法
模糊查询
直接循环写入数据
删除重复记录
删除重复的记录,并保存第一条记录或保存最后一条记录
MSSQL数据库的定期自动备份计划。
一个比较实用的大数据量分页存储过程
数据库存储过程分页显示
ACCESS数据库的压缩,备份,还原,下载,删除的实现
sql编程的几个常识
SQL连接查询介绍
Sql Server基本函数
分页的存储过程
SQL Server全文索引服务
如何在SQLSERVER中快速有条件删除海量数据
整理一下SQLSERVER的排序规则
SQL Server各种日期计算方法(收藏)
全文检索技术 sql server

MSSQL 中的 SQL Server用索引视图查看性能状况


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 191 ::
收藏到网摘: n/a

SQL Server中,视图是一个保存的T-SQL查询。视图定义由SQL Server保存,以便它能够用作一个虚拟表来简化查询,并给基表增加另一层安全。但是,它并不占用数据库的任何空间。实际上,在你查询它之前,视图并不做任何事情。

索引视图

SQL Server 2000和2005中,你能够给视图增加索引。但是,如果视图只是一个保存在数据库中的查询定义,在运行前没有自己的数据,你如何给那个定义建立一个索引呢?嗯,这比较麻烦。

索引视图是一个已被物化或保存在数据库中的视图。当基本表更新时,给视图建立的索引由数据库引擎保存和更新。当你的结果集返回许多行并且需要求总数时,索引视图十分有用。这是因为数据库引擎必须在基表数据更新时维持视图索引,这可能会降低事务的性能。

要给一个视图建立一个索引,视图定义必须遵守某组条件和会话设置,同时要求把基表和视图定义联系起来。如果你确定你的视图满足这些标准(我将在后面讨论这一点),你给视图建立的第一个索引必须是一个唯一的聚集索引。建立的第一个视图必须在一组栏上,并且被聚集,以便索引被物化。

下面代码说明如何建立一个索引视图。其中的脚本将建立SalesHistory表,并给它加载数据。

CREATE TABLE SalesHistory
(           
SaleID INT IDENTITY(1,1),                 
Product VARCHAR(30),            
SaleDate SMALLDATETIME,            
SalePrice MONEY
)

DECLARE @i SMALLINT
SET @i = 1

WHILE (@i <=10000)

BEGIN           
INSERT INTO SalesHistory           
(Product, SaleDate, SalePrice)           
VALUES           
('Computer', DATEADD(mm, @i, '3/10/2006'),
DATEPART(ms, GETDATE()) + (@i + 57) )
      INSERT INTO SalesHistory           
(Product, SaleDate, SalePrice)           
VALUES           
('BigScreen', DATEADD(mm, @i, '3/2/2006'),
DATEPART(ms, GETDATE()) + (@i + 13) )
      INSERT INTO SalesHistory           
(Product, SaleDate, SalePrice)           
VALUES           
('PoolTable', DATEADD(mm, @i, '2/11/2007'),
DATEPART(ms, GETDATE()) + (@i + 29) )
      SET @i = @i + 1

END
GO
 

下面的代码将建立一个视图来概括表中的数据:

CREATE VIEW vw_salesbyproduct

AS

SELECT

Product,

COUNT_BIG(*) as ProductCount,

SuM(SalePrice) as TotalSales

FROMdbo.SalesHistory

GROUP BY Product
 

由于它只是一个T-SQL查询定义,建立这个视图不用多少时间。建立好视图后,你就可以像对一个表一样对它进行查询。

SELECT Product, TotalSales, ProductCount

FROM vw_SalesByProduct

WHERE product = 'Computer'
 

如果你在SQL Server Management Studio或Query Analyzer中设置选项来查看查询的“执行计划”(Execution Plan),你会注意到上面的查询使用一个表扫描来找出Computer产品的总计结果。表扫描一般用于数据没有索引的情况下,它对整个结果集进行扫描以找出需要的结果。

进行一些简单的改变,你就能够修改视图,以便你可以给它增加一个索引,从而改善搜索性能。首先,你必须设定下面的会话设置:

SET ANSI_NULLS ON

GO

SET ANSI_PADDING ON

GO

SET ANSI_WARNINGS ON

GO

SET CONCAT_NULL_YIELDS_NULL ONGO

GO

SET QUOTED_IDENTIFIER ON

GO

SET NUMERIC_ROUNDABORT OFF

GO

现在你可以建立自己的视图。为使事情更加简单,我建立一个崭新的视图。

CREATE VIEW dbo.vw_SalesByProduct_Indexed

WITH SCHEMABINDING

AS

SELECT

Product,

COUNT_BIG(*) AS ProductCount,

SUM(ISNULL(SalePrice,0)) AS TotalSales

FROM dbo.SalesHistory

GROUP BY Product

GO
 

下面的脚本给我们的视图建立索引:

CREATE UNIQUE CLUSTERED INDEX

idx_SalesView ON vw_SalesByProduct_Indexed(Product)
 

为表明已经给视图建立一个索引,并且它确实占用数据库的空间,运行下面的脚本查明聚集索引有多少行以及视图占用多少空间。

EXECUTE sp_spaceused 'vw_SalesByProduct_Indexed'
 

下面的SELECT语句和以前的语句相同,只是这次它执行一个聚集索引搜索,这个过程完成得非常快。

SELECT

Product, TotalSales, ProductCount

FROM vw_SalesByProduct_Indexed

WHERE Product = 'Computer'
 

不要忘记性能测试

索引视图如果使用得当,它会十分有用,因为它们能够显著地提高查询的性能。但是,由于聚集索引增加的性能,数据库引擎必须在视图基表的所有事务过程中维持那个索引。因为这个交换,建立一个索引视图可能对系统有益,也可能给系统造成伤害。确定这样做是有益还是有害的最佳方法就是进行全面的性能测试。