【问题标题】:TSQL : Timeouts on High traffic tableTSQL:高流量表超时
【发布时间】:2014-05-15 09:50:05
【问题描述】:

我的表超时问题。

示例表:

Id BIGINT, 
Token uniqueidentifier, 
status smallint, 
createdate datetime, 
updatedate datetime

我正在将来自 2 个不同存储过程的数据插入到此表中,这些存储过程用事务包装(具有特定升级)以及 1 个每 30 秒执行一次的作业。

我只有其中 1 个超时,而奇怪的是它来自简单的一个

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,最后使用表中的DELETEs,但是当我检查此表的高 IO 时,该作业耗时不超过 3 秒.

谢谢。

【问题讨论】:

  • 我认为您不需要对单个语句进行交易。一条语句成功与否。

标签: sql-server tsql timeout


【解决方案1】:

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

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

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

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

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

DBCC INPUTBUFFER(71);
GO

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

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

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多