• 索引视图是否物理存储在数据库中以及使用索引视图


    索引视图是否物理存储在数据库中以及使用索引视图的一些见解

    索引视图是否物理存储在数据库中以及使用索引视图的一些见解

    前言

    这个话题我本来是写在文章里没有写在随笔里的,不过赶脚不写在随笔里其他人就看不到了,因为小弟对视图的认识不深

    希望写在随笔里让大家也讨论一下这个话题

    小弟在文章的结尾会把我们公司系统使用索引视图的情况告诉大家,希望大家也把你们在系统中如何应用索引视图的在评论中分享一下

    让小弟也学习一下,因为小弟对于索引视图的认识也是比较浅的


    视图的种类

    先来看一下SQLSERVER中视图的种类

    1、标准视图

    2、索引视图:加了索引,在SQL2000之后提供的新功能。在视图上创建索引后,该视图的结果集随机被具体化,并保存在数据库的物理存储中。

    对索引视图创建的第一个索引必须是唯一聚集索引。创建了唯一聚集索引后,才可以创建其他非聚集索引。如果删除视图,该视图的索引也被删除,

    若删除聚集索引,视图的所有非聚集索引和自动创建的统计信息也被删除。删除视图的聚集索引将删除存储的结果集,并且索引视图会变为标准视图

    3、分区视图:在一台或多台服务器间水平连接一组成员表中的分区数据,使数据看起来像来自一个表。依据连接数据服务器的不同,

    他又分为本地分区视图和分布式分区视图。分布式分区视图用于实现数据库服务器联合


    验证

    为了区分标准视图和索引视图,我们分别建立一张基本表、一个索引视图、一个标准视图,两个视图都是基于那个基本表

    使用下面SQL语句建立测试环境

     View Code
     View Code

    而标准视图是没有数据页存储视图数据的

    1 INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,stand_View_Users,-1) ')
    2 
    3 SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC 
    1 消息 5239,级别 16,状态 1,第 12 无法处理对象 ID 487672785 (对象 'stand_View_Users'),因为此 DBCC 命令不支持此类型的对象。
    3 
    4 (0 行受影响)

    我们看一下数据页37398里的内容,数据页里存储的内容跟基本表是一样的

     View Code

    我们再向索引视图插入更多数据使他出现聚集索引页

     View Code

    再看一下表中页面情况

     View Code

    我们看一下13571聚集索引页的内容

    1 DBCC SHOWCONTIG(index_View_Users)
    2 GO
    3 
    4 DBCC SHOWCONTIG(stand_View_Users)
    5 GO

    1 SELECT * FROM sys.[dm_db_partition_stats] WHERE [object_id]=OBJECT_ID('index_View_Users')

    小结

    从上面的测试结果可以看出,索引视图已经跟基本表一样存储到硬盘中而且占用数据库空间

    并且聚集索引页、数据页这些跟基本表的没有什么区别


    插入数据到索引视图究竟做了什么操作?

    我这里主要对基本表、标准视图、索引视图的数据插入和数据更新进行简单分析(主要看执行计划),看一下索引视图的更新究竟做了什么?

    我在下面的测试里将执行计划导出来,大家可以把sqlplan文件拖到SSMS里就可以看到执行计划了

    插入数据到基本表

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%8F%92%E5%85%A5%E5%88%B0%E5%9F%BA%E6%9C%AC%E8%A1%A8.rar

    插入数据到索引视图

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%8F%92%E5%85%A5%E5%88%B0%E7%B4%A2%E5%BC%95%E8%A7%86%E5%9B%BE.rar

    插入数据到标准视图

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%8F%92%E5%85%A5%E5%88%B0%E6%A0%87%E5%87%86%E8%A7%86%E5%9B%BE.rar

    小结:

    插入记录  

    1、插入记录到基本表,会同时插入记录到索引视图  

    2、插入记录到索引视图,会同时插入记录到基本表  

    3、插入记录到标准视图,会同时插入记录到基本表和索引视图

    因为标准视图没有物理存储到硬盘中,所以只插入数据到索引视图和基本表中


    更新索引视图的数据究竟做了什么操作?

    更新基本表数据

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%9B%B4%E6%96%B0%E5%9F%BA%E6%9C%AC%E8%A1%A8%E6%95%B0%E6%8D%AE.rar

    更新索引视图数据

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%9B%B4%E6%96%B0%E7%B4%A2%E5%BC%95%E8%A7%86%E5%9B%BE%E6%95%B0%E6%8D%AE.rar

    更新标准视图数据

     View Code

    sqlplan下载:http://files.cnblogs.com/lyhabc/%E6%9B%B4%E6%96%B0%E6%A0%87%E5%87%86%E8%A7%86%E5%9B%BE%E6%95%B0%E6%8D%AE.rar

    小结:

    更新记录  

    1、更新基本表记录,会同时更新索引视图记录  

    2、更新索引视图记录,会同时更新基本表记录  

    3、更新标准视图记录,会同时更新基本表和索引视图记录


    总结

    从上面的实验可以看出无论是插入记录还是更新记录,基本表和索引视图都需要进行同步插入和更新记录,如果索引视图引用多个基本表

    那么这个开销也是不小的

    我们公司系统的情况:

    首先声明的是公司的数据库设计是我们的项目经理设计跟编码的,我自己并没有参与其中

    而我们项目经理的经验也是比较丰富的,不是那种装B的人

    我们公司的系统中的数据库表是没有一个外键跟视图的!!


    我的猜想:
    1、增加冗余字段,尽量不使用外键,其实增加冗余字段也可以解决视图问题,因为视图可以引用多张表
    2、视图在插入记录和更新记录的时候会增加额外开销
    3、如果需要级联更新,就使用事务更新两个表,插入记录也是一样
    4、报表也会引用多张表,那么使用多表连接的SQL语句来解决一张报表引用多张基本表的问题,不用视图

    以上观点只针对我们公司的系统,可能不适合您们的系统,希望大家在评论中也留下您们的见解,谢谢大家了o(∩_∩)o


    补充

    删除了聚集索引之后,索引视图是否会变成标准视图呢?

    1 DROP INDEX CIX_View_Users ON index_View_Users

    插入数据到基本表

     View Code

    可以看到索引视图已经没有了

    查询视图数据的时候还可以查询,证明索引视图已经退化为标准视图了

    如有不对的地方,欢迎大家拍砖o(∩_∩)o

  • 相关阅读:
    C# Dev PropertyGrid
    C# PropertyGrid控件应用心得
    FileWriter不覆盖
    FileWriter
    java试题
    Java线程池
    java自带线程池和队列详细讲解
    HashMap练习题
    Map集合
    java指定
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3312822.html
Copyright © 2020-2023  润新知