TSQL:高流量表上的超时

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秒.

谢谢.

M.A*_*Ali 2

这很可能是因为某些其他进程正在阻止您的插入操作,它可能是另一个插入、删除、更新或某些触发器或任何其他 sql 语句。

要找出谁阻止了您的操作,您可以使用一些易于使用的存储过程,例如

  1. sp_who2
  2. sp_whoIsActive (我的首选)

当您的插入语句正在执行/挂起时,执行这些过程之一,看看谁在阻止您。

sp_who2中,您将看到名为Blk_by的列,从该列获取SPID并执行以下查询

DBCC INPUTBUFFER(71);
GO
Run Code Online (Sandbox Code Playgroud)

这将返回该进程 ID 执行的最后一个查询。而且它的 sql 语句格式不是很好,所有查询都在一行中,您需要在 SSMS 中对其进行格式化才能真正读取它。

另一方面,sp_WhoIsActive将仅返回阻止其他进程的查询,并将查询格式化为用户执行的查询。它还将为您提供该查询的执行计划。