繁体   English   中英

如何加快并发相同查询的SQL Server 2008 R2

[英]How to speed up concurrent identical queries SQL server 2008 R2

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

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

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

我的问题是,当许多客户端处于活动状态时,它们会在“相同”时间调用相同的存储过程,并将性能降低(例如,小于1秒的查询),而单独调用时可能会花费大约20秒钟,因为它可能等待其他客户端完成。

SQL Server中是否有什么可以帮助我解决的问题? 我在考虑结果的缓存或可以停止一个查询阻止另一个查询的方式?

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

谢谢,安德鲁

注意事项:

  • 首先,将WITH(NOLOCK)添加到可以执行此操作的表中。 记住NOLOCK是READUNCOMMITED的提示,这意味着它不会读取已经在处理中的挂起的更改,但是它将防止等待表被释放。
  • 在生产服务器中进行调查时,请使用sp_who2。 在多台机器上启动您的应用程序或网站,以重现导致性能降低的情况,获取耗时的报告或操作,并使用sp_who2分析Management Studio中的情况。 您将能够识别“暂停”选择
  • 使用sp_lock查看确切锁定了哪些对象

锁定类型可以是:

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

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

另一个性能问题是,如果未对tempdb数据库进行优化,则临时表可能会使其过载。 运行事件探查器以分析正在发生的事情。 仅过滤您需要评估结果的存储过程。

如果有其他想法,我将添加更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM