【问题标题】:SQL table - Insert and Deletes time out, select OKSQL 表 - 插入和删除超时,选择确定
【发布时间】:2015-06-01 19:34:40
【问题描述】:

我在 SQL Server 2008 R2 中有一个数据库,其中所有表似乎都正常运行,除了一个表。

在此表中,我无法删除一行或插入一行,因为它持续了超过 30 分钟并超时。

我的插入看起来像这样:

INSERT INTO [dbo].[brokenTable] ([Change], [Date], [ProdId], [IntCol]) 
VALUES ('test', getdate(), null, '99999')

但是,我可以选择。选择前 200,000 名需要 33 秒。表中只有约 260,000 行。有五列(一个 int 主键、一个日期、另一个 int 列和 2 个 varchar 列。)

这张桌子以前工作得很好而且很快,我根本没有改变结构。

有没有人知道为什么会发生这种情况,以及如何解决?

【问题讨论】:

  • 可能是一个持有锁的开放事务。在 SSMS 的一个窗口中执行INSERT,同时它被阻止转到 SSMS 中的另一个查询窗口并查看sys.dm_os_waiting_tasks 以查看是什么阻止了它。
  • LCK_M_IX 似乎很可疑。您可以按被阻止交易的session_id 进行过滤,以确保您正在查看正确的内容。在您进行插入的窗口中,这将显示在状态栏的底部,或者首先在该连接中运行SELECT @@SPID
  • @user1308743 - 什么是blocking_session_id?您可以将其插入sys.dm_exec_sessionssys.dm_exec_connections 以获取有关违规会话的更多详细信息。您是否在 SSMS 中有任何打开的窗口,您自己可能在其中留下了未处理的交易?
  • @user1308743 首先通过马丁所说的检查导致会话的原因。如果可以结束它,只需输入“kill [session #]”即可。
  • @user1308743 - You can use this query to see the last SQL run by that session first 在杀死它之前。杀死将回滚该事务完成的所有工作。

标签: sql-server sql-server-2008-r2


【解决方案1】:

致未来可能有同样问题的人。

我认为查询速度很慢,但事实并非如此。它被另一个会话锁定。如果你关注 Martin Smith 的 cmets,他会帮我找到修复它的那个。

首先,我跑了

select * from sys.dm_os_waiting_tasks

在运行无法完成的查询时,以及在未运行时再次查找 LCK_M_IX。我使用了该行中的会话 ID,并将其与

中的行匹配
select * from sys.dm_exec_sessions

并找到了阻止我查询的违规会话!

因为我知道这是一个安全的会议结束,我结束了它

Kill [sessionId]

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2011-05-15
    • 2019-08-22
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多