索引视图是不是在事务期间更新?
Posted
技术标签:
【中文标题】索引视图是不是在事务期间更新?【英文标题】:Do Indexed Views Update During a Transaction?索引视图是否在事务期间更新? 【发布时间】:2010-11-08 12:39:56 【问题描述】:假设我有一个 SQL Server 索引视图 vwIndexedView,它从两个表 tbTableOne 和 tbTableTwo 中读取数据。
如果我对事务中的两个表之一执行操作,我的索引视图会发生什么情况?它是立即刷新,还是我必须在结果输入之前提交我的事务?
例如:
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 等待?
简单的答案是肯定的,视图将使用新值进行更新,但这会带来一些性能问题,如果您从其他位置插入这些基础表,您也应该考虑一下。
【讨论】:
以上是关于索引视图是不是在事务期间更新?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06