【个人学习笔记15之--浅谈视图】

来源:互联网 发布:c语言1到100的求和 编辑:程序博客网 时间:2024/05/09 22:19

视图

 

概念:

 

一个没有索引的视图其实只是一个虚拟表,没有任何物理的数据,它就是一段代码组成的东西,包含了描述它的元数据,如结构,依赖性等.
1.它可以对基础数据做些聚合之类的操作后提供使用.
2.它可以筛选数据,让客户只能访问视图以达到保护原表的目的.
3.同样,视图不能包含单独的ORDER BY .因为它被认为是一个表,表是逻辑实体,本身里面的数据时随便放的,并米有刻意按照某个顺序存储数据.

 

 

说几点关于视图的东西


1.视图中的ORDER BY


 视图中的ORDER BY 绝非它本意--它不起排序的作用
 平时我们用 select top n * from tb order by col1 这里的order by 不仅排序还确定要返回哪几行
 视图我们用 select top n * from tb order by col1 这里的ORDER BY 只能用来确定希望返回哪几行.
 因为我们的视图最后出来的东西本质上是个表,这个时候你去查询这个视图的时候 出来的结果可不一定是按照COL1排序的
 因为视图它就是个表 表是逻辑实体,本身里面的数据时随便放的

.看实例:
 


 -------结果并没有按照你期待的B排序 这就说明视图里的order by 是没有起到排序作用的----------------
 
2.视图刷新的问题 sp_refreshview
 有时候你会发现当你修改基础表的结构后,视图并没有跟着变,解决的方法就是修改后立即进行视图的刷新.特别是你试图出现select *的时候
   

 

  ------------这里分享个一次刷新所有视图的代码(书上)-----------


  --刷新所有视图

 

 

3.视图的模块化解题
 如果一个题目解题思路写成一个语句比较长 比较难读 可以尝试用视图分开它 依次攻破 --(书上的例子,懒了下,盗用数据说明问题)
  

 

 -----目标结果-----根据本月于上个月差来判断销售趋势
 


 --VSalesRN视图给每个月上编号
  

 

  --VGrp视图根据对标识的分组,取出最后标定范围的分组因子grp
 


 --VTrends视图 根据sgn 和 grp分组 求出自己范围内的最大最小值 并且标识出对应的中文表示
  

 

 ----------检索视图------------
 


 
5.视图的更新 update
 视图不仅可以修改,而且可以更新.因为对它操作时会影响基础表的。
 这里我就说一个注意点:当你的视图是由2个表链接查询出来的,而你做的操作是更新的时候,要注意了:会出现状况:
 
 --显示数据
 


 --更新:我们想把订单号为1001的那个公司名cname 改个名字,初期是只想改这么个订单(这是本来想做的)
  

 

 ------其实这里很好理解,修改的是表Customers 而不是视图 所以改了再查视图 视图又是从表那边链接过来 当然三个就一起变了----
 
6.视图的一些选项


 a.ENCRYPTION
  对触犯器 视图 UDF 存储过程的创建文本可以加密.
  不过听说已经找到解密的方法http://www.360doc.com/content/050909/13/717_11438.html


 b.SCHEMABINDING
  把视图绑定到一个基对象的框架上,SQL将不允许删除基对象或者修改视图里引用的列


 c.check option
  使用了这个选项的视图会防止与视图的查询筛选器有冲突的INSERT 和 UPDATE 操作.举个例子:
 


4.索引视图 indexed_view
 一个没有索引的视图只不过是一个虚拟的表,拥有了索引,视图等于获得新生,他所包含的数据将要物理化,就要变成真正的表。
 它会同步于基础表,就是说你修改基础表会同时更新索引视图,这里修改的性能会降低的.
 但是索引视图同样提高了一些聚合查询和高成本的链接性能.
 创建索引的限制:


 a.第一个索引必须是唯一聚集索引.
 b.视图必须用SCHEMABINDING,要求看上面;
 c.如果对视图的查询进行了聚合操作,它的SELECT列表必须包含COUNT_BIG(*)这个聚合函数
 
  ---上面这个视图就是一个典型的索引视图---


  ---索引视图有个好处,比如你在外部基础表上查询,注意基础表上是没索引的,但是你可以再查询时候用到视图的索引.
    

 

 --这个查询就是用到了视图上的聚集索引,而且AVG(OD.Quantity)这个视图里不包含的聚合函数也用到了-----


 d.还有几个SQL2005用到索引视图的情况:


  1.当外部查询的where 条件或者ON 条件的筛选区间是试图筛选器的子区间的时候,查询可以用到索引视图.
   比如:外部查询n<100 视图查询n<200


  2.外部查询使用一个与视图查询等价的逻辑筛选条件
   比如:外部 n=100 视图100=n


  3.关于NULL值插入
   你使用UNIQUE约束想约束表中非NULL值要唯一,但是NULL值可以多次插入,但是UNIQUE约束认为NULL值是相等的,所以你在表中该列
   已经存在NULL值情况下是不能再次插入的.这个时候你就可以使用索引视图解决这个问题
       

 ----视图索引保证不准插入重复值,但是因为WHERE keycol IS NOT NULL 所以它没有限定NULL的重复性.
   ------这里也再次说明对基础表的操作又一次牵动了视图索引------------
   
 

原创粉丝点击