【发布时间】: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_sessions或sys.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