SQL Server性能和locking

我有一个SQL Server 2000实例,它在一组4或5个表上运行多个并发select语句。 通常,在这些查询期间服务器的性能变得极度下降。 只要查询的其他运行时间,查询可能会占用10倍的时间,并且在对象资源pipe理器中获取表列表或运行sp_who等简单操作可能需要几分钟的时间。

我已经尽力找出这些问题的原因,而我发现的唯一性能指标是平均锁存等待时间。 我读过超过1秒钟的等待时间是不好的,在大量使用的情况下,我的距离在20到75秒之间。

所以我的问题是,这可能是什么问题? SQL不应该能够处理单个表上的多个select而不会损失太多的性能? 任何人都可以build议某处去从这里调查这个问题?

谢谢您的帮助。

取决于locking。 大多数人完全忘记的是关心锁。 标准连接设置完整的读取锁(可重复读取),可能会用尽资源。

如果你只读,只读一次,使用一种方式标记的连接和一个sql语句营销方式不离开任何锁。

将适用于大多数asp.net页面 – 你读,目前的页面…没有必要locking这个操作,只有当你开始写作。

如果应用程序确实只是对该表执行读取操作,则阻塞应该不成问题。 我会:

  1. 确保该表具有正在运行的查询的适当索引。 其中一个索引应该是一个聚集索引。
  2. 确保最近索引已经重build或表格统计已经更新。
  3. 看看磁盘性能,这是一个常见的问题。 如果秒/转移数量超过几十毫秒,请尝试find一种方法来最小化正在进行的I / O量(通常意味着添加索引,更改表模式或更改查询),或者改进磁盘子系统的性能。 这可能意味着将文件移动到不同的磁盘上,更改RAID级别,摆脱RAID控制器策略等。
  4. 对于SQL2000,我会确保处理器禁用了超线程。

SQL Server 2000使用locking机制来升级锁以涵盖越来越多的模式 – 也就是说,你可以开始locking一个表的页面,但是当你locking更多的行时,这个锁会很快被提升到一个完整的表锁。 对于某些types的查询,这绝对会导致性能下降。

以至于MS在更高版本中更改了locking机制,使其更像是Oracles行级locking。