sqlserver 建立索引视图各问题!

  1. --我的 tab 表有 60398 条数据,大家可以用自己的任意表测试  
  2. SELECT * FROM tab   
  3. GO  
  4.   
  5. --新建表MYTABLE,带序号  
  6. IF object_id(N'[dbo].[MYTABLE]'IS NOT NULL  drop table MYTABLE  
  7. SELECT IDENTITY(INT,1,1) ID,* INTO MYTABLE FROM tab  
  8. GO  
  9.    
  10. SELECT * FROM MYTABLE  
  11. --CREATE CLUSTERED INDEX PRIMARYKEY ON MYTABLE(ID)  
  12. --if exists(select * from sysindexes where id=object_id('MYTABLE') and name='PRIMARYKEY')   
  13.   
  14.   
  15. --建立分割表,把MYTABLE中的数据划分到两个表中,用凉表做测试  
  16. IF object_id(N'[dbo].[MYTABLE_TOP50PERTCENT]'IS NOT NULL drop table MYTABLE_TOP50PERTCENT  
  17. IF object_id(N'[dbo].[MYTABLE_LAST50PERTCENT]'IS NOT NULL  drop table MYTABLE_LAST50PERTCENT  
  18. SELECT TOP 50 PERCENT * INTO MYTABLE_TOP50PERTCENT FROM MYTABLE  
  19. SELECT * INTO MYTABLE_LAST50PERTCENT FROM MYTABLE  WHERE ID NOT IN (SELECT ID  FROM MYTABLE_TOP50PERTCENT)  
  20. GO  
  21.   
  22.   
  23. --建立联合视图(这个建法不正确,等下改正)  
  24. IF object_id(N'[dbo].[VW_MYTABLE_ALL]'IS NOT NULL DROP VIEW VW_MYTABLE_ALL  
  25. GO  
  26. CREATE VIEW dbo.VW_MYTABLE_ALL  
  27. --WITH SCHEMABINDING /*如添加WITH SCHEMABINDING,则表必须带架构名,如dbo.MYTABLE_TOP50PERTCENT*/  
  28. AS  
  29. SELECT * FROM MYTABLE_TOP50PERTCENT  
  30. UNION ALL  
  31. SELECT * FROM MYTABLE_LAST50PERTCENT  
  32. GO  
  33.   
  34. --查询视图,对表扫描  
  35. SELECT * FROM VW_MYTABLE_ALL  
  36.   
  37.   
  38. --对分割表创建索引,对视图的查询会转向表的查询  
  39. if exists(select * from sysindexes where id=object_id('MYTABLE_TOP50PERTCENT'and name='PRIMARYKEY1')   
  40. drop INDEX MYTABLE_TOP50PERTCENT.PRIMARYKEY1  
  41. if exists(select * from sysindexes where id=object_id('MYTABLE_LAST50PERTCENT'and name='PRIMARYKEY2')   
  42. drop INDEX MYTABLE_LAST50PERTCENT.PRIMARYKEY2  
  43. CREATE CLUSTERED INDEX PRIMARYKEY1 ON MYTABLE_TOP50PERTCENT(ID)  
  44. CREATE CLUSTERED INDEX PRIMARYKEY2 ON MYTABLE_LAST50PERTCENT(ID)  
  45.   
  46.   
  47. --查询视图,此时使用索引查询  
  48. SELECT * FROM VW_MYTABLE_ALL  
  49.   
  50.   
  51.   
  52. --删除表的索引,建立视图索引  
  53. if exists(select * from sysindexes where id=object_id('MYTABLE_TOP50PERTCENT'and name='PRIMARYKEY1')   
  54. drop INDEX MYTABLE_TOP50PERTCENT.PRIMARYKEY1  
  55. if exists(select * from sysindexes where id=object_id('MYTABLE_LAST50PERTCENT'and name='PRIMARYKEY2')   
  56. drop INDEX MYTABLE_LAST50PERTCENT.PRIMARYKEY2  
  57.   
  58. CREATE UNIQUE CLUSTERED INDEX IND_VW_MYTABLE ON VW_MYTABLE_ALL(ID ASC)  
  59. go  
  60. --错误:无法对视图 'VW_MYTABLE_ALL' 创建 索引,因为该视图未绑定到架构  
  61. --解决:因此之前创建的视图应该为这样,将视图绑定到架构  
  62. IF object_id(N'[dbo].[VW_MYTABLE_ALL]'IS NOT NULL DROP VIEW VW_MYTABLE_ALL  
  63. GO  
  64. CREATE VIEW dbo.VW_MYTABLE_ALL  
  65. WITH SCHEMABINDING  
  66. AS  
  67. SELECT * FROM dbo.MYTABLE_TOP50PERTCENT  
  68. UNION ALL  
  69. SELECT * FROM dbo.MYTABLE_LAST50PERTCENT  
  70. GO  
  71.   
  72. --错误:在绑定到架构的对象中不允许使用语法 '*'。  
  73. --解决:必须把视图中的查询列名写出,如下  
  74. IF object_id(N'[dbo].[VW_MYTABLE_ALL]'IS NOT NULL DROP VIEW VW_MYTABLE_ALL  
  75. GO  
  76. CREATE VIEW dbo.VW_MYTABLE_ALL  
  77. WITH SCHEMABINDING  
  78. AS  
  79. SELECT ID,ProductKey,CustomerKey,OrderDateKey,UnitPrice,UnitPriceDiscountPct FROM dbo.MYTABLE_TOP50PERTCENT  
  80. UNION ALL  
  81. SELECT ID,ProductKey,CustomerKey,OrderDateKey,UnitPrice,UnitPriceDiscountPct  FROM dbo.MYTABLE_LAST50PERTCENT  
  82. GO  
  83.   
  84. --创建视图索引  
  85. CREATE UNIQUE CLUSTERED INDEX IND_VW_MYTABLE ON dbo.VW_MYTABLE_ALL(ID ASCON ps_OrderDateKey(id)  
  86. go  
  87. /*  
  88. !!仍有错误:  
  89. 无法对视图 'Sales_DW.dbo.VW_MYTABLE_ALL' 创建 索引,因为其中包含一个或多个 UNIONINTERSECT 或 EXCEPT 运算符。  
  90. 如果将查询作为原始视图的 UNIONINTERSECT 或 EXCEPT 运算符的输入,请考虑为每个这样的查询创建一个单独的索引视图。  
  91. */  
  92.   
  93. /*==========================================================================================*/  
  94. /*==========================================================================================*/  
  95. --白忙一场!!视图索引只对单个查询建立,一下以MYTABLE看看  
  96. IF object_id(N'[dbo].[VW_MYTABLE]'IS NOT NULL DROP VIEW VW_MYTABLE  
  97. GO  
  98. CREATE VIEW dbo.VW_MYTABLE  
  99. WITH SCHEMABINDING  
  100. AS  
  101. SELECT ID,ProductKey,CustomerKey,OrderDateKey,UnitPrice,UnitPriceDiscountPct FROM dbo.MYTABLE  
  102. GO  
  103.   
  104. if exists(select * from sysindexes where id=object_id('VW_MYTABLE'and name='IND_MYTABLE')  
  105.     drop INDEX VW_MYTABLE.IND_MYTABLE  
  106. CREATE UNIQUE CLUSTERED INDEX IND_MYTABLE ON dbo.VW_MYTABLE(ID ASC)  
  107. go  
  108.   
  109. SELECT * FROM VW_MYTABLE  
  110. SELECT * FROM MYTABLE  


  1. <strong><span style="font-size:14px;">--网上查到的各约束规则</span></strong>  
  2. /*  
  3. 一个标准视图转换为一个索引视图必须遵守以下规则:  
  4. A.视图必须使用With Schemabinding选项来创建;  
  5.    如果创建视图时没有with Schemabinding,试图创建视图时就会报错:……因为该视图未绑定到架构  
  6. B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;  
  7. C.视图所用到的基本表必须和视图属于同一个所有者;  
  8. D.视图只能链接同一个数据库中的表;  
  9. E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFTRIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;  
  10. F.视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;  
  11. G.视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;  
  12. H.视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;  
  13. I.视图不能包含Text、ntext、image类型的列;  
  14. J.如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);  
  15. K.视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;  
  16. L.所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;  
  17. M.在创建索引时或创建索引后执行IUD时,必须显示或隐式地执行:  
  18.         Set ANSI_NULLS ON  
  19.         SET ANSI_PADDING ON  
  20.         SET ANSI_WARNINGS ON  
  21.         SET ARITHABORT ON  
  22.         SET CONCAT_NULL_YIELDS_NULL ON  
  23.         SET QUOTED_IDENTIFIER ON  
  24.         SET NUMERIC_ROUNDABORT OFF  
  25. N.索引视图只有在SQL Server2000的企业版或开发版或者更高的版本中才能创建。  
  26.   
  27. 在一个表上创建了索引视图后,对其执行delete操作时报错:DELETE 失败,  
  28. 因为下列 SET 选项的设置不正确: 'CONCAT_NULL_YIELDS_NULL, ANSI_PADDING,ARITHABORT',删除这个视图问题就解决了  
  29.   
  30. */ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值