浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

这篇具有很好参考价值的文章主要介绍了浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

(一)前言

(二)正文

1. 物化视图(索引视图)与查询重写的基本概念

2. 创建测试环境

(1)建表

(2)写数据

3. 索引视图创建

(1)创建语法

(2)为索引视图创建索引

 4. 查询重写

5. 为什么查询会被重写

 6. 索引视图什么时候更新

7. 改变基于视图的查询


(一)前言

之前做ORACLE DBA的时候,在参与业务涉及中常会遇到物化视图这个概念,同样在SQL SERVER中也有类似于ORACLE的物化视图的功能,只是名称变成了索引视图。本文我们将采用SQL SERVER来谈一谈索引视图(物化视图)以及基于此的查询重写。

(二)正文

1. 物化视图(索引视图)与查询重写的基本概念

与普通视图比,物化视图就是直接将数据存储起来了。而物化视图的作用之一就是可以实现查询重写。SQL Server中的索引视图就具有查询重写的功能,所谓的查询重写,就是如果符合条件的数据在索引视图上,并且查询列都包含在在索引视图上,此时可以直接通过查询索引视图来替代基于原始表的查询。

2. 创建测试环境

(1)建表

创建两张表,一张表头TESTZYY,一张明细TESTLMN,仅仅作为DEMO使用

--创建两张表,一张表头TESTZYY,一张明细TESTLMN,仅仅作为DEMO使用
CREATE TABLE TESTZYY
(
    HeadId      INT PRIMARY KEY  ,
    HeadInfo    VARCHAR(50)      ,
    DataStatus  TINYINT          ,
    CreateDate  Datetime
)
GO;

CREATE TABLE TESTLMN
(
    HeadId      INT           ,
    DetailId    INT identity(1,1) PRIMARY KEY ,
    DetailInfo  VARCHAR(50)
)
GO;

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

(2)写数据

给上一步中创建的两个表各插入20万条数据。

--写入数据
DECLARE @i int = 0
WHILE @i<200000
BEGIN
    INSERT INTO TESTZYY values (@i,NEWID(),RAND()*10,GETDATE()-RAND()*100)
    INSERT INTO TESTLMN(HeadId,DetailInfo) VALUES (@i,NEWID())
    SET @i=@i+1
END
GO

 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

3. 索引视图创建

那么如何创建索引视图呢?语法上跟创建普通视图差别不大,但是不允许出现select *,表名上要加上Scheme,如下会做简单说明。

(1)创建语法

CREATE VIEW V_IndexViewTest WITH SCHEMABINDING
AS
    SELECT H.HeadId,H.CreateDate,H.DataStatus,D.DetailId,D.DetailInfo
    FROM dbo.TESTZYY H INNER JOIN 
                dbo.TESTLMN D ON H.HeadId = D.HeadId
    WHERE H.DataStatus = 0
GO;

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

TIPS:

创建时候一定要用INNER JOIN,否则在后续创建聚集索引时候会有报错! 

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 

(2)为索引视图创建索引

索引视图要求创建的第一个列为唯一聚集索引,所以如下,创建一个唯一的聚集索引。

create unique clustered index idx_headid
on V_IndexViewTest(detailid);

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

对于其他索引,可以跟在表上创建索引一样

create index idx_createdate on V_IndexViewTest(Createdate);

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 4. 查询重写

上面说了,查询重写就是将基于原始表的查询语句,直接在索引视图上查询实现,那么就来看一下查询重写是什么样子的?

下面来观察这么一个查询,SQL很明显地是基于原始表做的查询,跟普通查询并无二致,但是观察执行计划就会发现:这个执行计划走了一个索引查找,首先很清楚,TESTZYY上的CreateDate是没有索引的,这里走的索引就是V_IndexViewTest上的CreatDate列上的索引,也就是在索引视图上创建的第二个索引。

select H.headid,H.createdate,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0
and H.createdate > '2022-10-01 00:00:00.000'
and H.createdate < '2022-10-02 00:00:00.000'

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 如果,查询语句这么写,如下,在查询条件中增加了一个索引视图中没有的列,此时查询就不会被重写,直接走的是基于原始表的查询,跟普通查询并无二致。
其实原理不难理解,因为视图中并不包含HeadInfo这个列,如果在查询列上加上这个字段,视图中是没有这个字段的,那只能基于原始表做查询了。

select H.headid,H.createdate,H.headinfo,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0
and H.createdate > '2022-10-01 00:00:00.000'
and H.createdate < '2022-10-02 00:00:00.000'

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

5. 为什么查询会被重写

上面我们看到了,对于合适的查询,查询是会被重写的,也就是查询直接基于索引视图来实现,那么为什么会直接基于视图来实现呢?


还是处于性能上的考虑,因为索引视图在创建唯一的聚集索引之后,视图就“固化了”原始表的结果集,此时的视图与普通视图最大的区别就是,视图中直接存储了数据本身,而非一个查询,此时的视图中的数据集,相当于基于原表的一个“子集”,因为是子集,这个结果集必然小于原始表,那么同样的查询字段和查询条件,不但可以减少表与表之间的链接操作,且结果集更小,从这个视图上查询,因此同等条件下可以更快地返回结果,所以查询重写也就不难理解了。

结合上述结论,此时只要查询字段和查询条件一样,基于原始表的查询和直接查询索引视图是一样的,如下截图 :

select H.headid,H.createdate,D.detailid,D.detailinfo
from dbo.TESTZYY H inner join
     dbo.TESTLMN D on H.headid = D.headid
where H.datastatus = 0 and H.createdate > '2022-10-01 00:00:00.000' 
and H.createdate < '2022-10-02 00:00:00.000';

select headid,createdate,detailid,detailinfo
from dbo.V_IndexViewTest
where datastatus = 0 and createdate > '2022-10-01 00:00:00.000'
and createdate < '2022-10-02 00:00:00.000';

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 6. 索引视图什么时候更新

上面说了查询重写,如果条件允许,基于原始表的查询会直接从索引视图上来实现。可能有人会不放心,毕竟数据都是基于物理表做增删改的,而索引视图中的数据又是物理存在的,那就就会有一个担心,基于视图的查询会不会不准确?毕竟是我好好的一个查询,你默认给我定位到索引视图上,查询结果会跟原始表查询一致吗?

那么就要求证一下,索引视图中的数据是如何更新的。我们做这么一个测试,在基表,也就是TESTLMN中查询一条数据,看看到底在执行计划中发生了什么 可以明显地看到,不仅仅是往TESTLMN中写入了一条数据,同时,基于索引视图的查询也往索引视图中写入了一条数据,因此可以放心地使用索引视图而不必担心索引视图中的数据和基表的数据不一致的问题。

但是要注意的就是,此时的写,是写入基表的同事,也写入了索引视图,对写入的影响是肯定有一些的,如果对写入效率要求非常高,就要谨慎一点了。其实索引视图也是一种冗余写来实现查询效率的提高的。

insert into dbo.TESTLMN(HeadId,DetailInfo) values (666,newid());

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

7. 改变基于视图的查询

上面说了,某些基于视图的查询,是直接定位到视图,从视图中查询结果返回的,如下图

 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

但是如果真的不想从视图中查询,我就是想对比一下原始表和基于视图查询的(效率上的)区别,该怎么办?这个也好办,可以通过查询提示,将查询来基于原始表实现,也就是展开这个索引视图了OPTION (EXPAND VIEWS)这个查询提示就是将视图展开,从原始表进行查询,默认情况下是不展开的。如截图,可以强制展开索引视图,从原始表查询 :

select headid,createdate,detailid,detailinfo
from dbo.V_IndexViewTest
where datastatus = 0 and createdate > '2022-10-01 00:00:00.000'
and createdate < '2022-10-02 00:00:00.000' option(expand views);

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

那么效率对比呢?如下截图,粗看起来,这个效率差别还是挺大的,可见,SQL Server默认选择下,载效率上还是有一定的考虑的

浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

这里从索引视图查询,一是减少了表之间的join,而是索引视图的结果集更小,从中筛选符合条件的数据效率就会更好一些。所以,默认情况下是会从视图查询来对SQL进行查询重写的。索引视图的查询提示:with(no expand) 强制不展开,OPTION (EXPAND VIEWS)强制展开。

总结:

  本文粗浅地分析了SQL Server 中的索引视图以及索引视图带来的查询重写功能,通过索引视图固化基表的结果集,
  可以在一定程度上提高查询效率,尤其是在超级大的多表join的时候,直接将原始结果存为一个索引视图,
  通过对索引视图查询来减少表之间的join和IO来提高效率,不失为一种优化选择。
  需要注意的是,SQL Server的索引视图限制非常多,具体可以参考链接丛书或者MSND,并不是所有的情况都可以使用索引视图来实现。文章来源地址https://www.toymoban.com/news/detail-448035.html

到了这里,关于浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 面向区块链的高效物化视图维护和可信查询

    面向区块链的高效物化视图维护和可信查询

    人工智能技术与咨询  摘 要:区块链具有去中心化、不可篡改和可追溯等特性,可应用于金融、物流等诸多行业.由于所有交易数据按照交易时间顺序存储在各个区块,相同类型的交易数据通常会散布在诸多区块之中,降低了面向历史区块的追溯查询的处理效率.索引构建和物化视图

    2023年04月09日
    浏览(14)
  • 【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用

    【SQL Server】数据库开发指南(六)索引和视图的使用技巧、方法与综合应用

    本系列博文还在更新中,收录在专栏:#MS-SQL Server 专栏中。 本系列文章列表如下: 【SQL Server】 Linux 运维下对 SQL Server 进行安装、升级、回滚、卸载操作 【SQL Server】数据库开发指南(一)数据库设计的核心概念和基本步骤 【SQL Server】数据库开发指南(二)MSSQL数据库开发对

    2024年02月06日
    浏览(54)
  • 4、hive的使用示例详解-事务表、视图、物化视图、DDL(数据库、表以及分区)管理详细操作

    4、hive的使用示例详解-事务表、视图、物化视图、DDL(数据库、表以及分区)管理详细操作

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(9)
  • Azure SQL DB/MI以及SQL SERVER中sys.databases视图介绍

    Azure SQL DB/MI以及SQL SERVER中sys.databases视图介绍

    目录 (一)前言 (二)sys.databases简介 1. sys.databases 概览 2. sys.databases 字段说明 3. 权限 (三)实战范例 1. 查询 sys.databases 视图 2. 检查 SQL 数据库中的复制状态 3. 检查 SQL 数据库中的时态保留策略状态        作为数据库相关工作人员,对于当前数据库服务器上所存在的

    2024年02月06日
    浏览(11)
  • SQL Server 数据表模糊查询(like 用法)以及查询函数

    在SQL Server Management Studio (SSMS) 中,进行模糊查询主要是通过使用 like 操作符来实现的。 like 操作符用于在 where 语句中搜索列中具有指定模式的数据。 我们在简单例子中来了解: % 通配符:表示任意数量的字符。 这个例子会选择 column_name 列中包含\\\"pattern\\\"这个词的所有记录,就

    2024年01月22日
    浏览(33)
  • hive-视图与物化视图

    1、一句话解释 一张虚表,不存数据,对外暴露真实表的一部分数据,增强数据保密性,查询的时候,底层会转换成对真实表的查询,走MapReduce。 2、参考资料 hive的视图_hive 视图_kcy000的博客-CSDN博客 二、物化视图 1、一句话解释 将视图持久化,不走MapReduce,提高查询效率 2、

    2024年02月12日
    浏览(13)
  • 4.2.1 SQL语句、索引、视图、存储过程

    怎么执行一条select语句 1.连接器 接收连接-》管理连接-》校验用户信息 2.查询缓存 kv存储,命中直接返回,否则继续执行 8.0已经删除 3.分析器 词法句法分析生成语法树 4.优化器 指定执行计划,选择查询成本最小的计划 5.执行器 根据执行计划,从存储引擎获取数据,并返回客

    2024年02月06日
    浏览(9)
  • 深入解析MySQL视图、索引、数据导入导出:优化查询和提高效率

    深入解析MySQL视图、索引、数据导入导出:优化查询和提高效率

    目录 1. 视图(View): 什么是视图? 为什么要使用视图? 视图的优缺点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 示例操作 没使用前 使用后 2. 索引(Index): 什么是索引? 为什么要使用索引?

    2024年02月13日
    浏览(14)
  • MongoDB中的物化视图

    视图,为查询提供了便利。定义视图时, 可以包含复杂的集合查询逻辑或隐藏敏感信息。构建查询语句时,无需重复构建和维护聚合管道查询中的多个过程。Mongodb查询优化器也可以调整查询管道中的顺序,与视图查询中定义的查询条件一起进行优化。 视图实时返回聚合查询

    2024年02月04日
    浏览(12)
  • ClickHouse-物化视图

    官方文档 什么是物化视图 ClickHouse 中物化视图(Materialized View)是一种预先计算并缓存结果的视图,它存储在磁盘上并自动更新,典型的空间换时间思路。物化视图是一种优化技术,它可以加速查询操作,降低系统负载,并提高查询性能。 创建语法: 物化视图工作流程 当你

    2024年02月11日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包