表提示对该视图中使用的视图和表的影响

时间:2014-06-17 10:27:28

标签: sql-server

我们可以使用像NOLOCK,PAGLOCK这样的表提示 但我的问题是......如果在视图定义中没有使用表提示 但在查询中使用,如

SELECT * FROM myview WITH(nolock)

会对该视图中使用的表格产生影响

1 个答案:

答案 0 :(得分:1)

逻辑上它应该......导致视图查询将针对表运行,因为视图本身不存储任何数据(除非它是索引/物化视图)。

Docmentation TABLE HINTS传播到实际表格。摘自文件[Remarks部分]

  

所有锁定提示都会传播到所有表和视图   由查询计划访问,包括在a中引用的表和视图   视图。此外,SQL Server执行相应的锁一致性   检查。

但它也说TABLE HINTS不适用于从其他表列表达式计算的计算列。

  

如果表包含由表达式计算的计算列   或函数访问其他表中的列,表提示是   没有在那些表上使用,也没有传播。例如,一个NOLOCK   表提示是在查询中的表上指定的。这张桌子有   由表达式和组合计算的计算列   访问另一个表中的列的函数。引用的表格   通过表达式和函数不使用NOLOCK表提示时   访问。

<强> TEST:

创建一个名为employee的表格,如下所示

create table employee(id int not null, name varchar(20));

1572866行附近插入。所以执行时需要花费时间。

创建如下视图(请参阅视图定义没有表提示)

create view testview
as
select * from employee;

从带有表格提示的视图中选择

select * from testview with(paglock,holdlock)

正在运行时...尝试在employee表格上执行插入操作,看看自己insert将如何等待select .. rom view完成。