TSQL:高流量表上的超时

时间:2014-05-15 09:50:05

标签: sql-server tsql timeout

我的桌子超时有问题。

示例表:

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

要了解谁阻止了您的操作,您可以使用一些常用的可存储过程,如

  1. sp_who2
  2. sp_whoIsActive (我的首选)
  3. 在执行/挂起插入语句时执行其中一个过程,看看谁阻止了你。

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

    DBCC INPUTBUFFER(71);
    GO
    

    这将重新启动该进程ID执行的最后一个查询。并且它的sql语句格式不是很好,所有查询都在一行中,您需要在SSMS中对其进行格式化以便能够读取它。

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