SQL中视图上能不能建立索引

SQL中视图上能不能建立索引,第1张

可以,试试我的语句,前两天刚用过

视图稍微有点不同,语句如下:

create view 视图名 with schemabinging as

select 列名 from dbo.表名 where 条件语句

(说明:“dbo.表名”前面的“dbo.”是不能省略的)

索引

create index 索引名 on 表名

(视图的某个列名 desc/asc)

你试下 去掉 where 条件的 [dbo] , 如果不行 参考下 下面的,方法 ~ 希望对你有用同学 在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。在视图上创建的第一个索引必须是唯一聚集索引。在创建唯一聚集索引后,可创建其它非聚集索引。视图上的索引命名规则与表上的索引命名规则相同。唯一区别是表名由视图名替换。(Sql Server联机帮助)

没研究过,说不出什么东西来,现在只把方法记下来。

语句:

Create VIEW vXXX WITH SCHEMABINDING AS……

Create UNIQUE CLUSTERED INDEX idxXXX ON vXXX(cXXX)

一个标准视图转换为一个索引视图必须遵守以下规则:

A.视图必须使用With Schemabinding选项来创建;

如果创建视图时没有with Schemabinding,试图创建视图时就会报错:……因为该视图未绑定到架构

B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;

C.视图所用到的基本表必须和视图属于同一个所有者;

D.视图只能链接同一个数据库中的表;

E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;

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的企业版或开发版或者更高的版本中才能创建。

在一个表上创建了索引视图后,对其执行delete *** 作时报错:Delete 失败,因为下列 SET 选项的设置不正确: 'CONCAT_NULL_YIELDS_NULL, ANSI_PADDING,ARITHABORT',删除这个视图问题就解决了

在视图上创建索引是有一定的限制的。如楼主所说,要在视图上创建索引,视图定义的时候要包含WITH

SCHEMABINDING选项,另外必须在视图上创建一个唯一聚集索引以后才可以创建非聚集索引。

写了个例子楼主看一下

CREATE

TABLE

dbo.Test(a

int,b

int)

GO

CREATE

VIEW

vTest

WITH

SCHEMABINDING

AS

SELECT

a,b

FROM

dbo.Test

GO

CREATE

UNIQUE

CLUSTERED

INDEX

IX_vTest_a

ON

vTest(a)

--注意,由于是唯一性索引,如果基表Test的a列包含重复值的话索引是不能创建成功的

GO

--再创建一个非聚集索引

CREATE

INDEX

IX_vTest_b

ON

vTest(b)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11350583.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存