SQL Server 视图

简介
视图可以看作定义在SQL Server上的虚拟表,是一种查看数据的入口,常规视图并不存储实际数据,仅仅存储y一个SELECT语句和所涉及表的 metadata(SQL Server维护了一组用于存储SQL Server中所有的对象,数据类型,约束条件,配置选项,触发器等信息,这些信息被称为元数据metadata),通过视图,客户端不再需要知道底层表的结构及其之间的关系,视图提供了一个统一访问数据的接口。

 

为什么要使用视图
  • 隐藏了底层表的结构,简化了数据访问的操作,加大了安全性,用户只能看到视图提供的数据
  • 方便权限管理,让用户对视图有权限而不是对底层表有权限,进一步加强了安全性

 

视图的分类
  1. 普通视图
  2. 索引视图
  3. 分割视图

 

普通视图
普通视图是由一个SELECT语句所定义,视图仅仅包含其定义和引用表的metadata,并不存储数据。
CRETAE VIEW view_name [WITH view_attribute]
AS
    SELECT ... FROM ...
    [WITH CHECK OPTION]
GO

view_attribute : 

  • ENCRYPTION:视图是加密的,如果选上这个选项,则无法修改

  • SCHEMABINDING:和底层引用的表进行定义绑定,这个选项选上的话,则视图引用的表就不能随便更改架构(比如列的数据类型),如果要更改底层表架构,则先DROP和或ALTER在底层表上绑定的视图

  • VIEW_METADATA:如果不选择,返回客户端的metadata是VIEW所引用表的metadata。如果选上了,则返回VIEW的metadata,再通俗点说,VIEW_METADATA可以让视图看起来像表一样,VIEW的每一个列的定义等直接告诉客户端,而不是所引用底层表列的定义。

 

WITH CHECK OPTION : 用于更新数据做限制

除了要满足上面的语法规则,还有一些规则需要遵守:

  • VIEW中,除非有TOP关键字,否则不能用ORDER BY语句(性能杀手)

  • VIEW在每个SCHEMA中命名必须独一无二

  • VIEW的嵌套不能超过32层(实际工作上连两层都不要嵌套)

  • VIEW不能建立在临时表上

  • VIEW不能对全文索引进行查询

创建视图:

CREATE VIEW view_name
AS
    SELECT col1,col2 FROM table_name

使用视图:

SELECT * FROM view_name

可以使用模板资源管理器快速创建VIEW模板:

 

 

索引视图
在普通的视图的基础上,为视图加上唯一聚集索引,这时这个视图就变成了索引视图。
视图+聚集索引=索引视图。
索引视图可以看成和一个表等效的对象
想要理解索引视图,就要先理解聚集索引,聚集索引简单来说理解成主键,数据库中的数据按照主键的顺序物理存储在表中,就像新华字典,默认是按照ABCD。。这样的方式进行内容设置,ABCD就相当于主键,这样就避免了整表扫描从而提高了性能,因此一个表中只能有一个聚集索引。
对于索引视图也是,如果为普通视图加上了聚集索引,那么这个视图就不再是SELECT语句和表的METADATA了,索引会将数据物理存储在数据库中,索引视图所存的数据和底层表保持同步
索引视图在SQL Server上的实现
SQL Server对索引视图有很多限制:
索引视图涉及的基本表必须ANSI_NULLS为ON
索引视图必须设置ANSI_NULLS和QUOTED_INDETIFIER为ON
缩影视图只能引用基本表
SCHEMABINDING必须设置
视图涉及表的架构要加上,比如dbo.table_name
查询语句不能用‘*’

 

分割视图

整个视图由几个平行表(表结构相同)进行UNION所获得的数据集

 

上面的视图所获的数据分别是由三个数据不相同的平行表组成。使用分布式分割视图最大的好处是提升性能,比如上面的例子中,我仅仅是想取得ContactID为8这位员工的信息,如果通过分布式视图获取的话,SQL Server就会仅仅只扫描包含ContactID为8的表2,从而避免了整表扫描,减少了IO的操作,从而提升了性能。
这里要注意的是,分割视图所涉及的表之间的主键不能重复,比如A表中ContactID是1-8,则表B就不能是2-9什么的

 

视图使用小技巧
  • 一定要将SELECT语句的性能跳到最优
  • 能使用存储过程和自定义函数替代VIEW的,尽量不要用VIEW,存储过程会缓存执行计划,性能更优,限制更少
  • 通过视图名查找视图的定义:SELECT *FROM sys.sql_modules WHERE object_id = OBJECT_ID('视图名称')
  • 手动同步视图数据:EXEC sp_refreshview '视图名称'

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值