0

我继承了一个支持基于 .NET 和 SQL Server 2008 R2 的解决方案。

该体系结构使得所有客户端必须彼此保持同步,这由一个 winsock 集线器处理,每个客户端都向该集线器发送和接收所做更改的通知。这些通知采用更新类型和关键字段的形式。

收到通知后,客户端窗口检查更新类型,如果他们认为感兴趣,则发出数据库命令(存储过程)以检索该键值的最新数据。通常调用的存储过程链接多个表以返回一个相当大的对象。

我的问题是,当许多客户端处于活动状态时,它们会在“同一”时间调用相同的存储过程并降低性能,例如 < 1 秒的查询,当单独调用时可能需要 c20 秒,因为它可能会等待其他客户端完全的。

SQL Server 中有什么开箱即用的东西可以帮助我解决这个问题吗?我正在考虑缓存结果或阻止一个查询阻塞另一个查询的方法?

我很欣赏我可能应该对客户端代码和通知过程进行一些更改以传递完全填充的对象,从而消除多次询问数据库的需要。然而,这是一个生命周期有限的遗留应用程序,以如此重要的方式升级将是一件令人头疼的事情。如果我可以使用 SQL Server 中有一个不错的简单开关,那将为我赢得所需的时间!

谢谢,安德鲁

4

1 回答 1

0

要记住的提示:

  • 首先,将 WITH (NOLOCK) 添加到可以执行此操作的表中。记住 NOLOCK 是 READUNCOMMITED 的提示,这意味着它不会读取已经在处理中的挂起更改,但它会阻止等到表被释放
  • 在生产服务器中调查时使用 sp_who2。在多台计算机上启动您的应用程序或网站,以便重现导致性能下降的场景,获取需要时间的报告或操作,并使用 sp_who2 分析 Management Studio 中发生的情况。您将能够识别 SUSPENDED 选择
  • 使用 sp_lock 查看究竟哪些对象被锁定

锁定类型可以是:

  • MD - 元数据锁
  • DB - 数据库锁
  • TAB - 表锁
  • PAG - 页面锁定

如果没有任何效果,您可以尝试分析查询计划,但您表示在隔离环境中时性能良好并查询此过程。

另一个性能问题,如果没有优化,临时表可能会使您的 tempdb 数据库过载。运行分析器来分析正在发生的事情。仅过滤评估结果所需​​的存储过程。

我会添加更多信息,以防我想到其他东西。

于 2013-09-17T15:13:53.323 回答