zoukankan      html  css  js  c++  java
  • sql 理解视图

    可以看作是定义在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,存储过程会缓存执行计划,性能更优

  • 相关阅读:
    ThreadLocal 详解
    外键的约束(Mysql、PostgreSQL)
    Linux命令中,$、#、@、0、1、2、*、?的作用
    $.ajax 方法参数总是记不住,在这里记录一下
    SVN提示https证书验证失败问题svn: E230001: Server SSL certificate verification failed:
    各类资源地址整合
    CentOS 7 上安装vim 解決 centos -bash: vim: command not found
    Beyond Compare 4提示已经过了30天试用期,破解方式,亲测可用
    Django 04 模板标签(if、for、url、with、autoeacape、模板继承于引用、静态文件加载)
    Django 03 模板路径、模板变量、常用的过滤器
  • 原文地址:https://www.cnblogs.com/niuzaihenmang/p/5708380.html
Copyright © 2011-2022 走看看