多个查询同时运行WITH(NOLOCK)

时间:2013-05-15 07:28:46

标签: sql-server

考虑持续使用高度活跃的远程数据库; 2个或者更多同时运行的查询返回 30m 记录,但在查询中使用 WITH(NOLOCK)会使系统无法使用吗?

高度活跃:大约200名用户,查询次数不等,从1条记录查询到上述最大值。

常数: 18/7

无法使用:延迟5-15分钟。外部应用或用户无法访问数据库进行查询。

2 个答案:

答案 0 :(得分:1)

如果你的意思是

  

在选择30米记录

时,其他用户不会使系统无法使用

不,WITH(NOLOCK)没有任何效果。

请注意,选择30m记录本身可能是一个非常I / O敏感的操作,所以我不会毫不犹豫地选择那么多记录,但WITH(NOLOCK)所有意图和目的只影响做选择的人的表现。

答案 1 :(得分:1)

您需要调查您的停机时间'无法使用'是合适的。猜测不会奏效。有许多情况会导致服务器“无法使用”,例如:

  • 数据库增长
  • 日志增长
  • core dump
  • 调度程序耗尽
  • 更多

其他时候,服务器可能只是“慢”并且看起来没有响应。扫描nilly-willy 3000万行表的200个查询可以导致scheduler exhaustion。你需要正确调查。 Waits and Queues是一种很好的使用方法(例如,它可以正确识别上面提到的调度程序耗尽)。

至于NOLOCK:从来没有合理的理由使用NOLOCK。您的用户see incorrect data right now。请考虑使用row versioning代替。