我们在使用视图的时候有时想怎么能给视图加索引呢,其实,视图和普通的表一样可以添加索引,当SQL Server必须联合很多表时,这项技术可以大大提高Select语句的性能。
当在视图上创建一个唯一聚集索引(unique clusterd index)时,SQL Server将物化这个视图。看下面的例子:
CREATE VIEW dbo.vtUsers
WITH SCHEMABINDING
AS
SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password,
dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname,
dbo.tUsers.sex, dbo.tUsers.birthday, dbo.tUsers.country, dbo.tUsers.city,
dbo.tUsers.address, dbo.tUsers.zip, dbo.tUsers.tele, dbo.tUsers.exdate,
dbo.tUsers.totalfund, dbo.tUsers.ordertotal, dbo.tUsers.jifen, dbo.tUsers.pid,
dbo.tUsers.agentid, dbo.tUsers.agentid2, dbo.tUsers.agentid3, dbo.tUsers.status,
dbo.tUsers.checkmod, dbo.tUsers.account, dbo.tUsers.bank, dbo.tUsers.logip,
dbo.tUsers.sitename, dbo.tUserInfo.siteurl
FROM dbo.tUsers INNER JOIN
dbo.tUserInfo ON dbo.tUsers.userid = dbo.tUserInfo.userid
WHERE dbo.tUserInfo.UserID >20
CREATE UNIQUE CLUSTERED INDEX idxvtUser
ON vtUsers(userid)
尽管这个索引只引用了列的一个子集,但是这个索引包含叶级别节点中的所有列(每个聚集索引也都是这样)。
和标准视图一样索引视图的创建和使用也都是有限制的。一个标准视图转换为一个索引视图必须遵守以下规则:
A.视图必须使用With Schemabinding选项来创建;
B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;
C.视图所用到的基本表必须和视图属于同一个所有者;
D.视图只能链接同一个数据库中的表;
E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;看下面的例子:
比如说创建了下面的视图(自链接):
CREATE VIEW dbo.vtUsers
WITH SCHEMABINDING
AS
SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password,
dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname
FROM dbo.tUsers Inner join
dbo.tUsers as t ON dbo.tUsers.userid = t.userid
这个视图是可以创建的,但是在创建索引时CREATE UNIQUE CLUSTERED INDEX idxvtUser ON vtUsers(userid) 就会出错了;
再看下面的视图(外部连接):
CREATE VIEW dbo.vtUsers
WITH SCHEMABINDING
AS
SELECT dbo.tUsers.userid, dbo.tUsers.username, dbo.tUsers.password,
dbo.tUsers.question, dbo.tUsers.answer, dbo.tUsers.email, dbo.tUsers.realname
FROM dbo.tUsers LEFT OUTER JOIN
dbo.tUserInfo ON dbo.tUsers.userid = dbo.tUserInfo.userid
在创建索引时也会出错的。
F. 视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;
G. 视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;
H. 视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;
I. 视图不能包含Text、ntext、image类型的列;
J. 如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);
K. 视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;
L. 所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;
M. 在创建索引时或创建索引后执行IUD时,必须显示或隐式地执行:
Set ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
各个选项的有关信息或意义,可以查阅SQL Server的联机丛书,这里就不再介绍了;
N. 索引视图只有在SQL Server2000的企业版或开发版或者更高的版本中才能创建。
如果一个视图可以添加唯一聚集索引,那么在添加了唯一聚集索引之后,该视图也可以像数据库表一样添加非聚集索引,CREATE INDEX idxvtUsers ON vtUsers(username,realname)。
分享到:
相关推荐
浅析SQL Server 2000索引视图:使用索引视图提高查询性能.pdf
从数据库管理系统 (DBMS) 的观点来看,视图是数据(元数据)的说明。创建典型视图时,通过 SELECT 语句(定义一个显示为虚拟表的结果集)来定义元数据。... 如果是非索引视图,视图在运行时将被实体化。
sqlserver 2008 索引与视图 详解
详细解说了索引与视图的相关内容
7,索引视图; 1.什么是视图 视图是由一个查询所定义的虚拟表,它与物理表不同的是,视图中的数据没有物理表现形式,除非你为其创建一个索引;如果查询一个没有索引的视图,Sql Server实际访问的是基础表。 ...
资源名称:SQL Server 视图及索引的创建及使用内容简介: 本文档主要讲述的是SQL Server 视图及索引的创建及使用;目的是通过企业管理器和Transact_SQL语句对视图进行创建、修改和删除通过企业管理器。希望本文档会给...
索引视图是一个已被物化或保存在数据库中的视图。当基本表更新时,给视图建立的索引由数据库引擎保存和更新。当你的结果集返回许多行并且需要求总数时,索引视图十分有用。这是因为数据库引擎必须在基表数据更新时...
利用SQL Server 2005索引视图提高数据库系统性能.pdf
通过SQLServer2005索引视图提高性能[收集].pdf
本文档介绍了 SQL Server 2005 Enterprise Edition 中经过改进的索引视图功能。文中对索引视图进行了说明介绍,并讨论了可通过该功能改善性能的一些具体情况。
通过 SQL Server 2000,SQL Server 视图的功能得到了...在 SQL Server 2000 和 2005 中,具有唯一的聚集索引的视图即为索引视图。本文所讨论的内容适用于 SQL Server 2005,其中有许多内容也适用于 SQL Server 2000。
2.掌握SQL Server Management Studio的启动和使用。 3.掌握SQL Server 2005服务器的配置和注册。 4.掌握SQL Server 2005查询的基本使用。 5.掌握应用SQL Server Management Studio创建数据库的方法。 6.掌握应用SQL ...
sql server视图详解,详细介绍了sql server的视图原理
1. 熟练掌握使用企业管理器和T-SQL语句创建、查询、更新、修改和删除视图。 2. 进一步掌握视图与基本表的联系与区别。 3. 理解索引的概念和作用。 4. 熟练掌握索引的创建与删除
简单明了介绍视图 事务 索引的使用 带N多实例
SQL Server 数据库基础.pdf,SQL Server 数据管理(常用函数).pdf,SQL Server 数据查询(表的关联).pdf,SQL Server 事务索引视图.pdf,SQL Server 存储过程及触发器.pdf,SQL Server 编程及高级查询.pdf,让你从入门...
视图索引存储过程 事务显示事务 隐式事务 --索引 作用:提高查询效率 降低新增修改和删除的效率 --主键索引 唯一索引 聚集索引非聚集索引 --创建索引 --索引index 默认创建的是不唯一,非聚集索引
GBase8s 索引测试方法 ...伪SQL代码如下: create table t(c1 int, c2 char(10), c3 date); create index common_idx on T(C1) ; --通过系统表查询索引的ID select name, id from sysobjects where name='
使用SQL Server索引视图时变通解决问题。
数据定义 模式的创建(1)和删除(1) 基本表的创建(3)、修改(1)和删除(1) 索引的创建(1)和删除(1) 数据操作 各类更新操作(插入数据(n) 、修改数据(1) 、删除数据(1) ) ...SQL Server 2008不能完全支持SQL99