Ori*_*ael 7 t-sql sql-server timeout
我有关于我的桌子超时的问题.
示例表:
Id BIGINT,
Token uniqueidentifier,
status smallint,
createdate datetime,
updatedate datetime
Run Code Online (Sandbox Code Playgroud)
我将数据从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
Run Code Online (Sandbox Code Playgroud)
当此表(TempTable)上有一些流量时,此过程会持续超时.
我检查了执行计划,似乎我没有错过两个存储过程中的任何索引.
此外,唯一的索引TempTable是群集PK Id.
有任何想法吗?
如果需要更多信息,请告诉我们.
使用此表的第二个存储过程不会导致任何大的IO或其他东西.
但是,这个工作UPDATE在这个表上使用了一个原子,并且在表的末尾使用了一个原子DELETE,但是当我检查这个表的高IO时,该工作不会超过3秒.
谢谢.
这很可能是因为某些其他进程正在阻止您的插入操作,它可能是另一个插入、删除、更新或某些触发器或任何其他 sql 语句。
要找出谁阻止了您的操作,您可以使用一些易于使用的存储过程,例如
sp_who2sp_whoIsActive (我的首选)当您的插入语句正在执行/挂起时,执行这些过程之一,看看谁在阻止您。
在sp_who2中,您将看到名为Blk_by的列,从该列获取SPID并执行以下查询
DBCC INPUTBUFFER(71);
GO
Run Code Online (Sandbox Code Playgroud)
这将返回该进程 ID 执行的最后一个查询。而且它的 sql 语句格式不是很好,所有查询都在一行中,您需要在 SSMS 中对其进行格式化才能真正读取它。
另一方面,sp_WhoIsActive将仅返回阻止其他进程的查询,并将查询格式化为用户执行的查询。它还将为您提供该查询的执行计划。