SQL Server如何知道锁定视图对象?

Joe*_*ney 12 sql sql-server view sql-server-2008 database-locking

在SQL Server 2008中我有一个观点V在表AB看起来大致是

create view V as
    select * from A
    union all
    select * from B
Run Code Online (Sandbox Code Playgroud)

读取V会导致查询在基表上获取意图共享锁,但也会在视图对象本身获取意图共享锁.

很清楚为什么我们需要表上的IS锁,我们可以看到视图上的IS锁阻止了对视图底层表的并发修改.没关系.

查询计划不包含视图.它已完全编译出来,在这种情况下生成的计划是两个基表中的行的简单连接.实际上,查询计划XML中唯一提到的视图是在语句文本中.

如果U在表上添加第二个视图,则读取V不会导致任何锁定U.这排除了发动机只需要对所有意见IS锁了AB.

数据库引擎如何知道对视图进行锁定?

  • 语句文本是否再次被解析?
  • 查询规划器和底层执行之间是否还有其他信息通道来传递此信息?

有关详细信息,请参阅相应的问题dba.stackexchange.

Mat*_*lie 0

默认情况下,视图像宏一样扩展到引用它们的查询中。

这可以被关闭,或者如果它们被实现的话会有所不同,等等,但类似宏的内联扩展是常态。这意味着锁定等的行为就像您执行了以下操作一样......

SELECT
  *
FROM
  blah
INNER JOIN
(
  yourViewCode
)
  AS aView
    ON aView.id = blh.id
Run Code Online (Sandbox Code Playgroud)

  • 这可能很方便理解,但是视图是在创建时进行编译的。如果基础表发生更改,默认情况下视图不会更改。特别是,出于这个原因,您应该避免在视图中“select *”。 (2认同)