假设我有一个SQL Server索引视图 vwIndexedView ,它可以从两个表中读取, tbTableOne 和 tbTableTwo 。< / p>
如果我在事务中的两个表之一上执行操作,我的索引视图会发生什么?它会立即刷新,还是我必须在结果输入之前提交我的交易?
例如:
BEGIN TRANSACTION testTransaction
INSERT INTO tbTableOne VALUES ('1', '2')
SELECT * FROM vwIndexedView
COMMIT TRANSACTION
SELECT * FROM vwIndexedView
第一个SELECT的结果是否与第二个结果不同?
答案 0 :(得分:10)
索引或索引视图会立即更新,作为执行更新的DML语句的一部分。在您的情况下,如果您分析INSERT的实际执行计划,您将看到它包含用于更新所有物理“分区”的运算符,并且您的索引视图就是这样的分区之一。
答案 1 :(得分:2)
索引视图立即刷新,您可以查看执行计划并亲自查看。这会导致很多锁争用:be ready to drop your indexed view
答案 2 :(得分:0)
这是一个集中竞争的表吗? I.E通过锁定交易中的插入物你会导致大量其他spid等待吗?
简单的答案是肯定的,视图将使用新值进行更新,但如果您从其他地方插入这些基础表,则会产生一些您应该考虑的性能问题。