sqlserver 建立索引视图各问题!

sqlserver 建立索引视图各问题!,第1张

概述--我的 tab 表有 60398 条数据,大家可以用自己的任意表测试SELECT * FROM tab GO--新建表MYTABLE,带序号IF object_id(N'[dbo].[MYTABLE]') IS NOT NULL drop table MYTABLESELECT IDENTITY(INT,1,1) ID,* INTO MYTABLE FROM tabGO SE

--我的 tab 表有 60398 条数据,大家可以用自己的任意表测试SELECT * FROM tab GO--新建表MYtable,带序号IF object_ID(N'[dbo].[MYtable]') IS NOT NulL  drop table MYtableSELECT IDENTITY(INT,1,1) ID,* INTO MYtable FROM tabGO SELECT * FROM MYtable--CREATE CLUSTERED INDEX PRIMARYKEY ON MYtable(ID)--if exists(select * from sysindexes where ID=object_ID('MYtable') and name='PRIMARYKEY') --建立分割表,把MYtable中的数据划分到两个表中,用凉表做测试IF object_ID(N'[dbo].[MYtable_top50PERTCENT]') IS NOT NulL drop table MYtable_top50PERTCENTIF object_ID(N'[dbo].[MYtable_LAST50PERTCENT]') IS NOT NulL  drop table MYtable_LAST50PERTCENTSELECT top 50 PERCENT * INTO MYtable_top50PERTCENT FROM MYtableSELECT * INTO MYtable_LAST50PERTCENT FROM MYtable  WHERE ID NOT IN (SELECT ID  FROM MYtable_top50PERTCENT)GO--建立联合视图(这个建法不正确,等下改正)IF object_ID(N'[dbo].[VW_MYtable_ALL]') IS NOT NulL DROP VIEW VW_MYtable_ALLGOCREATE VIEW dbo.VW_MYtable_ALL--WITH SCHEMABINDING /*如添加WITH SCHEMABINDING,则表必须带架构名,如dbo.MYtable_top50PERTCENT*/ASSELECT * FROM MYtable_top50PERTCENTUNION ALLSELECT * FROM MYtable_LAST50PERTCENTGO--查询视图,对表扫描SELECT * FROM VW_MYtable_ALL--对分割表创建索引,对视图的查询会转向表的查询if exists(select * from sysindexes where ID=object_ID('MYtable_top50PERTCENT') and name='PRIMARYKEY1') drop INDEX MYtable_top50PERTCENT.PRIMARYKEY1if exists(select * from sysindexes where ID=object_ID('MYtable_LAST50PERTCENT') and name='PRIMARYKEY2') drop INDEX MYtable_LAST50PERTCENT.PRIMARYKEY2CREATE CLUSTERED INDEX PRIMARYKEY1 ON MYtable_top50PERTCENT(ID)CREATE CLUSTERED INDEX PRIMARYKEY2 ON MYtable_LAST50PERTCENT(ID)--查询视图,此时使用索引查询SELECT * FROM VW_MYtable_ALL--删除表的索引,建立视图索引if exists(select * from sysindexes where ID=object_ID('MYtable_top50PERTCENT') and name='PRIMARYKEY1') drop INDEX MYtable_top50PERTCENT.PRIMARYKEY1if exists(select * from sysindexes where ID=object_ID('MYtable_LAST50PERTCENT') and name='PRIMARYKEY2') drop INDEX MYtable_LAST50PERTCENT.PRIMARYKEY2CREATE UNIQUE CLUSTERED INDEX IND_VW_MYtable ON VW_MYtable_ALL(ID ASC)go--错误:无法对视图 'VW_MYtable_ALL' 创建 索引,因为该视图未绑定到架构--解决:因此之前创建的视图应该为这样,将视图绑定到架构IF object_ID(N'[dbo].[VW_MYtable_ALL]') IS NOT NulL DROP VIEW VW_MYtable_ALLGOCREATE VIEW dbo.VW_MYtable_ALLWITH SCHEMABINDINGASSELECT * FROM dbo.MYtable_top50PERTCENTUNION ALLSELECT * FROM dbo.MYtable_LAST50PERTCENTGO--错误:在绑定到架构的对象中不允许使用语法 '*'。--解决:必须把视图中的查询列名写出,如下IF object_ID(N'[dbo].[VW_MYtable_ALL]') IS NOT NulL DROP VIEW VW_MYtable_ALLGOCREATE VIEW dbo.VW_MYtable_ALLWITH SCHEMABINDINGASSELECT ID,ProductKey,CustomerKey,OrderDateKey,UnitPrice,UnitPricediscountPct FROM dbo.MYtable_top50PERTCENTUNION ALLSELECT ID,UnitPricediscountPct  FROM dbo.MYtable_LAST50PERTCENTGO--创建视图索引CREATE UNIQUE CLUSTERED INDEX IND_VW_MYtable ON dbo.VW_MYtable_ALL(ID ASC) ON ps_OrderDateKey(ID)go/*!!仍有错误:无法对视图 'Sales_DW.dbo.VW_MYtable_ALL' 创建 索引,因为其中包含一个或多个 UNION、INTERSECT 或 EXCEPT 运算符。如果将查询作为原始视图的 UNION、INTERSECT 或 EXCEPT 运算符的输入,请考虑为每个这样的查询创建一个单独的索引视图。*//*==========================================================================================*//*==========================================================================================*/--白忙一场!!视图索引只对单个查询建立,一下以MYtable看看IF object_ID(N'[dbo].[VW_MYtable]') IS NOT NulL DROP VIEW VW_MYtableGOCREATE VIEW dbo.VW_MYtableWITH SCHEMABINDINGASSELECT ID,UnitPricediscountPct FROM dbo.MYtableGOif exists(select * from sysindexes where ID=object_ID('VW_MYtable') and name='IND_MYtable')	drop INDEX VW_MYtable.IND_MYtableCREATE UNIQUE CLUSTERED INDEX IND_MYtable ON dbo.VW_MYtable(ID ASC)goSELECT * FROM VW_MYtableSELECT * FROM MYtable



<strong><span >--网上查到的各约束规则</span></strong>/*一个标准视图转换为一个索引视图必须遵守以下规则: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 OFFN.索引视图只有在sql Server2000的企业版或开发版或者更高的版本中才能创建。在一个表上创建了索引视图后,对其执行delete *** 作时报错:DELETE 失败,因为下列 SET 选项的设置不正确: 'CONCAT_NulL_YIELDS_NulL,ANSI_padding,ARITHABORT',删除这个视图问题就解决了*/
总结

以上是内存溢出为你收集整理的sqlserver 建立索引视图各问题!全部内容,希望文章能够帮你解决sqlserver 建立索引视图各问题!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: http://outofmemory.cn/sjk/1176962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存