SQL Server如何知道锁定视图对象?
在SQL Server 2008中,我有一个看起来大致相似的表A和B的视图V
create view V as select * from A union all select * from B 从V读取会导致查询在基表上采取意图共享锁,而且在视图对象本身上也采用意向共享锁. 为什么我们需要表上的IS锁,我们可以看到视图上的IS锁阻止了对视图下面的表的并发修改.没关系. 查询计划不包含视图.它完全编译出来,在这种情况下生成的计划是两个基表中的行的简单连接.在查询计划XML中唯一提及的视图在语句文本中. 如果您在表上添加第二个视图U,则从V读取不会导致在U上执行任何锁定.这排除了引擎只对A和B上的所有视图执行IS锁定. 数据库引擎如何知道对视图进行锁定? >语句文本再次解析吗? 详见corresponding question on 解决方法从 my answer on dba.stackexchange复制:来自Conor Cunningham的任何引擎或优化器相关的最终来源:
我的信念是,执行计划的二进制版本(不是通过XML可读和暴露给我们的二进制版本,它只是二进制版本的一部分)必须包含一些指向原始查询中引用的视图的指针文字(这是上面提到的).它显然不是每次都解析查询文本. Conor意味着与上述同样重要,但是请注意不要泄露任何存储位置或方式的详细信息,因为这可能会从版本发布到甚至使用Service Pack或累积更新.他可能也不想鼓励任何侦探工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |