我们可以使用像NOLOCK,PAGLOCK这样的表提示 但我的问题是......如果在视图定义中没有使用表提示 但在查询中使用,如
SELECT * FROM myview WITH(nolock)
会对该视图中使用的表格产生影响
答案 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
完成。