在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锁定.
数据库引擎如何知道对视图进行锁定?
>语句文本再次解析吗?
>查询计划器和底层执行之间是否还有其他渠道的信息来传递这些信息?
解决方法
从
my answer on dba.stackexchange复制:
来自Conor Cunningham的任何引擎或优化器相关的最终来源:
We track things during compile to check at runtime. We do not parse
things at execution for this purpose.Note: the internals of what we do from one release to another are not
guaranteed. This is beneath the officially supported surface area.
我的信念是,执行计划的二进制版本(不是通过XML可读和暴露给我们的二进制版本,它只是二进制版本的一部分)必须包含一些指向原始查询中引用的视图的指针文字(这是上面提到的).它显然不是每次都解析查询文本. Conor意味着与上述同样重要,但是请注意不要泄露任何存储位置或方式的详细信息,因为这可能会从版本发布到甚至使用Service Pack或累积更新.他可能也不想鼓励任何侦探工作.