索引视图是不是在事务期间更新?

Posted

技术标签:

【中文标题】索引视图是不是在事务期间更新?【英文标题】:Do Indexed Views Update During a Transaction?索引视图是否在事务期间更新? 【发布时间】:2010-11-08 12:39:56 【问题描述】:

假设我有一个 SQL Server 索引视图 vwIndexedView,它从两个表 tbTableOnetbTableTwo 中读取数据。

如果我对事务中的两个表之一执行操作,我的索引视图会发生什么情况?它是立即刷新,还是我必须在结果输入之前提交我的事务?

例如:

BEGIN TRANSACTION testTransaction
INSERT INTO tbTableOne VALUES ('1', '2')
SELECT * FROM vwIndexedView
COMMIT TRANSACTION

SELECT * FROM vwIndexedView

第一个 SELECT 的结果会与第二个不同吗?

【问题讨论】:

【参考方案1】:

作为执行更新的 DML 语句的一部分,索引或索引视图会立即更新。在您的情况下,如果您分析 INSERT 的实际执行计划,您会发现它包含用于更新所有物理“分区”的运算符,并且您的索引视图是此类分区之一。

【讨论】:

【参考方案2】:

索引视图立即刷新,您可以查看执行计划并亲自查看。这会导致很多锁争用:be ready to drop your indexed view

【讨论】:

【参考方案3】:

这是一个集中竞争的桌子吗?即通过将其锁定以在事务中插入,您是否会导致大量其他 spid 等待?

简单的答案是肯定的,视图将使用新值进行更新,但这会带来一些性能问题,如果您从其他位置插入这些基础表,您也应该考虑一下。

【讨论】:

以上是关于索引视图是不是在事务期间更新?的主要内容,如果未能解决你的问题,请参考以下文章

133 MySQL视图事务索引(都很重要)

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

使用快照隔离防止 SQL 视图被冗长的删除/插入事务阻塞

在 READ UNCOMMITTED 事务期间使用索引导致无法获取更新锁

红移物化视图刷新是不是会锁定基表?

Mysql中高级操作中的视图_事务_索引_账户权限管理