我的CREATE View查询中是否需要NO LOCK

时间:2013-04-23 22:32:10

标签: sql-server view

我正在MS SQL Server上创建一个视图。我没有太多接触过MS SQL,也不熟悉NO LOCK提示。我理解它的作用,但我不知道是否需要在我的情况下使用它。我被问到是否应该加入它,我不知道。

在用于创建视图的所有查询后,是否需要添加NO HINT?或者这对用户查询视图本身有什么影响? USER是否应该根据VIEW将NO LOCK添加到查询中?

对最佳方法和任何澄清的任何指导表示赞赏!

2 个答案:

答案 0 :(得分:7)

我会先回答你的问题。

最好从外部而不是在视图中的表上对视图进行NOLOCK提示。

例如

select * from vwTest with (nolock)

set transaction isolation level read uncommitted
select * from vwTest

这样做是因为您作为创建者正在为更广泛的用户群提供服务,这些用户群可能会或可能不像您自己一样熟悉SQL。通过不在视图中封装NOLOCK提示,鼓励其他开发人员真正考虑他们如何以安全有效的方式检索数据。

现在有关NOLOCK的更多信息。如果你100%确定基础数据不再变化,这是一个很好的技巧,一个很好的例子是当ETL系统完成当天加载数据时。它在只读报告系统中也很方便,您再次确定报告运行之间没有数据移动。

否则,不建议在系统中使用提示。如果你真的不了解其含义,那弊大于利。

请参阅以下链接,了解NOLOCK可能造成的损失: Previously committed rows might be missed if NOLOCK hint is used Timebomb - The Consistency problem with NOLOCK / READ UNCOMMITTED

答案 1 :(得分:3)

直接来自Doc

  

<强>注意:   由于SQL Server查询优化器通常会为查询选择最佳执行计划,因此我们建议有经验的开发人员和数据库管理员仅将提示用作最后的手段。

特别是NOLOCK的暗示是一个臭名昭着的有害和坏主意。它只应用于特殊情况和特定的需求:例如,当您不担心返回的数据是否正确时。