--我的 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 建立索引视图各问题!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)