TSQL: timeouts d'attente sur la table à trafic élevé

J'ai des problèmes avec les timeouts d'attente d'une table sur le mien.

Exemple de tableau:

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

J'insère des données dans cette table de 2 procédures stockées différentes qui sont emballées avec la transaction (avec l'escalade spécifique) et également 1 travail qui exécute une fois toutes les 30 secondes.

Je reçois le timeout d'attente de seulement 1 d'entre eux, et la chose étrange que c'est la simple

 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 

Quand il y a du trafic sur cette table ( TempTable ), cette procédure continue de recevoir le timeout.

J'ai vérifié le plan d'exécution et il semble que je n'ai manqué aucun index dans les deux procédures stockées.

En outre, le seul index sur TempTable est le PK en cluster sur Id .

Des idées?

Si plus d'informations sont nécessaires, dites-le.

La 2ème procédure stockée utilisant cette table ne provoque pas de grosse E / S ou quelque chose.

Le travail, cependant, utilise un UPDATE atomique sur cette table et à la fin DELETE s de la table, mais comme j'ai vérifié sur IO élevé de cette table, le travail ne prend pas plus de 3 secondes.

Merci.

C'est très probablement parce qu'un autre process bloque votre opération d'insertion. Il peut s'agir d'une autre insertion, suppression, mise à jour ou d'un triggersur ou de toute autre instruction sql.

Pour savoir qui bloque votre opération, vous pouvez utiliser certaines procédures stockées avialable esaily comme

  1. sp_who2
  2. sp_whoIsActive (Mes préférés)

Pendant que votre instruction d'insertion est exécutée / raccrochée, exécutez l'une de ces procédures et voyez qui vous bloque.

Dans sp_who2 vous verrez une colonne nommée Blk_by récupérer le SPID de cette colonne et exécuter la requête suivante

 DBCC INPUTBUFFER(71); GO 

Cela ré-exécutera la dernière requête exécutée par cet identifiant de process. et il n'est pas très bien formaté l'instruction sql, toute la requête sera dans une seule ligne que vous aurez besoin de formater dans votre SSMS pour être en mesure de le lire.

D'un autre côté, sp_WhoIsActive ne returnnera que les requêtes qui bloquent un autre process et formatera la requête au moment où l'user l'a exécuté. En outre, il vous donnera le plan d'exécution pour cette requête.