我最近将一个Web应用程序迁移到另一个数据中心。这包括将数据库从SQL 2000移动到2005,这不应该是一个问题本身(我运行SQL 2000到2008 R2的同一个应用程序的其他实例)。
问题是,在迁移之后,某些操作(尤其是UPDATE
)变得非常慢(在我的应用程序中定义的任何限制之后超时,我尝试了6分钟)。
我尝试在Management Studio上运行相同的查询,但结果不一致。有时它只是立即运行,但有时它需要永远,我必须取消查询。在我的应用程序上,它总是超时(经典ASP应用程序)。
它发生在多个查询上,但最常见的是一个看起来像这样的查询:
UPDATE mytable SET timestampcol = GETDATE() WHERE record_id = 12345 /* record_id is the PK */
我已经尝试过了:
sp_updatestats
和sp_updatestats 'resample'
,但没有运气。所以,我被困住了。有没有人知道可能发生的事情,我该如何解决?
更新
查看sys.dm_tran_locks
,我可以看到在我的应用运行查询时有两个锁定了:
request_mode request_type request_session_id
S LOCK 65
IX LOCK 67
我还意识到在我尝试运行SP调用卡上的查询之前出现了S
锁定。我现在正在修改SP以试图理解为什么在SP完成运行后锁仍然存在。
更新2 - Aaron Bertrand的答案问题(见评论)
该程序是否使用交易? 不,整个应用程序中没有交易
是否有可能未提交交易的代码路径? N / A
谁在调用其他存储过程?相同的脚本正在调用它,在有问题的查询之前几行
您是否在.NET中使用某种事务上下文?不,它不是.NET,它是经典的asp(我必须维护旧的遗留代码)
< / LI>为什么app不调用存储过程?你的意思是代替直接从(ADO)connection.execute运行有问题的查询?好吧,也试过了,结果相同。
为什么在SSMS中运行有问题的查询时调用其他存储过程不会影响您?我不知道!但是目前SSMS的更新运行正常,无论我是否在此之前调用sp。
伙计们,谢谢你们所有的帮助,但我即将放弃这一点。在某人决定移动服务器之前,事情才有效。问题只是落在了我的手上,我会试着将它传递给其他人。
答案 0 :(得分:0)
答案 1 :(得分:0)
原来这是对桌子的锁定。我仍然不明白为什么它被锁定,但我通过将WITH(NOLOCK)
提示添加到我的存储过程来解决它。