可以看作是定义在sqlserver上的虚拟的表,本身并不存储数据,仅仅存储一个select语句和涉及的表的引用

通过视图,客户端不再需要知道底层表结构和其之间的关系,视图提供了一个统一访问数据的接口

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

视图分为三类:
普通视图,索引视图,分割视图

普通视图:
由一个select语句所定义,仅仅包含其定义和被引用表

参数还是比较少:

ENCRYPTION:视图是加密的,如果选上这个选项,则无法修改,创建视图的时候需要将脚本保存,否则再也不能修改啦

SCHEMABINDING:如果这个选项被选上,则视图所引用到的表不能随便更改架构(比如列的数据类型),如果需要更改底层表结构,则先drop或者alter在底层表之上绑定的视图

视图中的规则:
1 在视图中,除非有Top关键字,否则不能用order by子句,可以用 Top 100 percent
2 Compute,compute by,into关键字不允许出现在view中
3 View不能建立在临时表上
4 View不能对全文索引进行查询

索引视图:

在普通视图的基础上,为视图建立唯一聚集索引,这时这个视图就变成了索引视图,
视图 + 聚集索引 = 索引视图

聚集索引简单来说可以理解为主键,数据库中的数据按照主键的顺序物理存储在表中,这样避免了整表扫描,从而提高了性能,因此一个表中只能有一个聚集索引

索引视图:为一个视图加上聚集索引后,索引视图会将数据物理存储在数据库中,索引视图所存的数据和索引视图中所涉及的底层表保持同步

如果索引视图中有聚合函数,会将聚合函数计算的结果存入索引视图,所以当大量数据使用到了索引视图之后,并不必要每次都进行聚合运算,

每次索引视图所涉及的表进行update,insert,delete这些操作之后,sqlserver都会标记出改变的行,让索引视图进行数据同步,如果操作频繁,数据库可能需要做大量的同步操作,又会影响性能

如果需要在普通视图上加上唯一聚集索引,使其成为索引视图,有以下几点限制:

1 索引视图涉及的表必须 ANSI_NULLS和QUOTED_INDETIFIER 设置为on

2 索引视图只能引用基本表
3 SCHEMABINDING 必须设置
4 定义索引视图时必须使用Schema.ViewName这样的全名
5 索引视图中不能有子查询
6 avg,min max,var,varp,stdev,stdevp,这几个聚合函数不能用

例如:

--建立视图
CREATE VIEW v_Test_IndexedView
WITH SCHEMABINDING
AS
SELECT p.Name,s.OrderQty,s.Id
FROM Production.Product p
inner join Sales.SalesOrderDetail s
ON p.ProductID=s.ProductID
GO
--在视图上建立唯一聚集索引
CREATE UNIQUE CLUSTERED INDEX indexedview_test1
ON v_Test_IndexedView(Id) 例2:

create VIEW Test2
WITH SCHEMABINDING
AS

SELECT c.Id,c.Nickname FROM dbo.Customer AS c:

--给该视图添加唯一聚集索引
CREATE UNIQUE CLUSTERED INDEX test_index
ON Test2(Id)

 

注意:即使没有使用这个聚集索引视图,直接使用视图里面的查询,性能也会大幅提高,不过只有在SQL SERVER企业版和开发版才有

分割视图:
由本地视图和分布式视图组成
分布式视图:由几个不同的数据源进行Union所获的
比如数据由三部分组成,三部分表结构相同,列数据类型相同,
如果从该分布式视图中取Id为2的整行数据,sqlserver就会从第一部分取,避免了整表扫描,大大减少了IO操作,从而提高了性能
注意:分布式分割视图所涉及的表之间的主键不能重复,因为如果重复肯定乱套了

使用这种方式如果查询包含了聚合函数,尤其是聚合函数中还包含了distinct,或者不加where进行排序,那性能绝对会大大下降,因为聚合函数需要扫描分布式分割视图中所有的表,然后进行union操作后再进行运算

通过视图更新数据不推荐,因为视图不能接受参数,一般使用存储过程

视图中的小技巧:
1 通过视同名称查询视图的定义
SELECT * FROM sys.sql_modules
WHERE object_id=OBJECT_ID('视图名称')
2 普通视图仅仅存储的是select和所引用表的metadata,当底层表数据改变,有时候视图中的metadata并没有及时同步,可以通过下面代码手动同步

EXEC sp_refreshview 视图名称

注意:view最好不要嵌套,如果非要嵌套,最多套一层
能用存储过程和自定义函数代替view的,尽量不要用view,存储过程会缓存执行计划,性能更优

sql 理解视图的更多相关文章

  1. 使用SQL Server视图的优缺点

    SQL Server视图我们经常会用的到,下面就为您介绍使用SQL Server视图的优缺点,希望可以对您SQL Server视图有更多的了解. 在程序设计的时候必须先了解视图的优缺点,这样可以扬长避 ...

  2. 11、SQL Server 视图、数据库快照

    SQL Server 视图 什么是视图? 视图是一个虚拟的表,内容源于查询的结果集.只有当视图上建立了索引后,才会具体化. 视图可以筛选和处理数据,而不是直接访问基础表.如:创建一个视图,只展示源表中 ...

  3. (4.22)sql server视图/索引视图概念

    (4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...

  4. CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板

    C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...

  5. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  6. SQL SERVER视图对查询效率的提高

    SQL SERVER视图不仅可以实现许多我们需要的功能,而且对于SQL SERVER查询效率的提高也有帮助,下面一起来了解一下. 有两张数据表:A和B,其中A的记录为2万条左右,而B中的数据为200万 ...

  7. sql中视图的作用

    视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态 ...

  8. 【机房重构】SQL之视图

    近期在重构机房收费系统,越往后就会越感觉到这里很多其它的是对之前学过知识(数据库,设计模式)的一种应用和回想.比方在登录功能中用到了抽象加反射,在学生下机中,我们能够用触发器来同一时候更新两个表.这里 ...

  9. sql中视图视图的作用

    视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态 ...

随机推荐

  1. CentOS 5.6 安装Oracle Java 和 Eclipse

    1.卸载原有OpenJDK 1. 使用java  -version查看当前Java版本信息 2. 使用rpm  -qa  |  grep  java 列出所有被安装的java rpm package ...

  2. 搭建Discuz! (mysql+apache+Discuz! )

    0. 配置环境 0.0 安装apache 0.1 安装php 1.数据库准备 1.1 创建数据库用户 1.2 创建discuz使用的数据库(编码:utf8-general-ci) 1.3 把1.2创建 ...

  3. hdoj 2817 A sequence of numbers【快速幂】

    A sequence of numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. 转载 ASP.NET Web API 学习

    转载关于ASP.NET Web API 的学习网址 http://www.cnblogs.com/aehyok/p/3432158.html http://www.mashangpiao.net/Ar ...

  5. maven快速入门

    一.maven maven可以说是管理项目的优秀工具,管理jar包 二.mave安装 1.先安装jdk(本文不详细讲) 2.安装maven ①.maven下载   http://maven.apach ...

  6. 【翻译自mos文章】DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果的解释

    DBA_JOBS 和 DBA_JOBS_RUNNING 不同的结果 參考原文: Different Results from DBA_JOBS and DBA_JOBS_RUNNING (Doc ID ...

  7. pomelo windows 安装笔记

    1.安装nodejs http://nodejs.org/download/...这个简单.. 2.下载pomelo..并且 安装所需要的包.未能加载visual c++组件 “VCBuild.exe ...

  8. mysql 高可用方案漫谈(一) 转阿里云

    https://yq.aliyun.com/articles/2237?spm=5176.blog2238.yqblogcon1.7.e5fyEy#index_section

  9. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...

  10. C语言创建并使用dll

    利用C语言创建 利用 C++使用: 参见前面  利用C语言创建并使用lib 如法炮制创建 showDll Dll代码 __declspec(dllexport) double myDivision(i ...