2013-05-15 73 views
0

考虑到一个高度活跃的远程数据库在不断的使用;将2或更多同时运行的查询返回大约30m记录,但在查询中使用WITH(NOLOCK)使系统无法使用?多个查询同时运行WITH(NOLOCK)

高度活跃:约200位用户,查询范围从1个记录查询到上述最大值不等。

恒: 18/7

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

+3

定义“不可用”。定义“高度活跃”。定义“不断使用”。 – Oded

+0

现在如何:) – mechanicum

回答

1

您需要调查您的停机时间'不可用'作为适当的。猜测不起作用。有很多情况下,可以使一台服务器 '无法使用',如:

  • 数据库增长
  • 日志增长
  • 核心转储
  • 调度疲惫
  • 更多

其他次服务器可能只是“缓慢”而且看起来没有反应。 200个查询扫描30万行的表可以导致scheduler exhaustion。您需要妥善调查。 Waits and Queues是一个很好的方法(例如它可以正确识别上面提到的调度程序耗尽)。

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

1

如果你的意思

使系统其他用户无法使用较少,同时选择30米记录

不行,WITH(NOLOCK)没有任何作用。

请注意,选择30m记录本身很可能是一个非常I/O敏感的操作,所以我不会在选择那么多的记录方面行动迟缓,但所有意图和目的的WITH(NOLOCK)只影响做选择的人。

+0

我只是好奇,如果其他用户和应用程序使用相同的数据库会注意到,正在查询30m记录。例如,如果数据库的速度变慢,应用程序就会超时,人们的反应会变慢。查询完成需要花费很长时间(大约10分钟)。 – mechanicum

+1

这很大程度上取决于你愿意抛出的硬件配置*(读钱)*,你应该做一些压力测试以找出答案,但是我的第一反应是:是的,这将是显而易见的。 –