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

MSSQL
SQL Server中删除重复数据的几个方法
SQL Server 基础概念集
SQL Server导入导出
SQL SERVER实用技巧
sql server 常用函数
如何维护SQL Server的“交易日志”
SQL Server数据备份处理过程探讨
JSP中tomcat的SQL Server2000数据库连接池的配置
SQL Server服务器安装剖析
SQL Server 2005数据加密技术应用研究
SQL Server数据库的备份和恢复措施
SQL Server 2005性能测试实践
Jboss下MS SQL Server配置指导
Oracle和SQL Server 追求完美还是讲求实用
SQL Server服务器安装剖析
SQL Server:Oracle与SQL Server事务处理的比较
SQL Server:利用配置文件实现SQL Server与Oralce访问类的转换
SQL Server:测试SQL Server业务规则链接方法
SQL Server :SQL Server 2008高可用性解决方案优劣分析
SQLServer:数据库恢复

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 195 ::
收藏到网摘: 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'
 

不要忘记性能测试

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