我的桌子超时有问题。
示例表:
Id BIGINT,
Token uniqueidentifier,
status smallint,
createdate datetime,
updatedate datetime
我将数据从2个不同的存储过程插入到此表中,这些存储过程包含事务(具有特定的升级)以及1个每30秒执行一次的作业。
我只从他们中的一个获得超时,并且从简单的那个中获得了奇怪的东西
BEGIN TRY
BEGIN TRAN
INSERT INTO [dbo].[TempTable](Id, AppToken, [Status], [CreateDate], [UpdateDate])
VALUES(@Id, NEWID(), @Status, GETUTCDATE(), GETUTCDATE() )
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
END CATCH
当此表(TempTable
)上有一些流量时,此过程会持续超时。
我检查了执行计划,似乎我没有错过两个存储过程中的任何索引。
此外,TempTable
上的唯一索引是Id
上的群集PK。
有什么想法吗?
如果需要更多信息,请告诉。
使用此表的第二个存储过程不会导致任何大的IO或其他东西。
然而,这个作业在这个表上使用了一个原子UPDATE
,并且从表中使用了DELETE
,但是当我检查这个表的高IO时,该作业没有超过3秒。
感谢。
答案 0 :(得分:2)
最合适的是因为某些其他进程阻止了您的插入操作,它可能是另一个插入,删除,更新或某些触发器或任何其他sql语句。
要了解谁阻止了您的操作,您可以使用一些常用的可存储过程,如
sp_who2
sp_whoIsActive
(我的首选) 在执行/挂起插入语句时执行其中一个过程,看看谁阻止了你。
在 sp_who2 中,您会看到名称 Blk_by 的列,从该列获取 SPID 并执行以下查询
DBCC INPUTBUFFER(71);
GO
这将重新启动该进程ID执行的最后一个查询。并且它的sql语句格式不是很好,所有查询都在一行中,您需要在SSMS中对其进行格式化以便能够读取它。
另一方面, sp_WhoIsActive 只会返回阻止其他进程的查询,并且会在用户执行时将格式化查询。它还将为您提供该查询的执行计划。