2014-05-15 6 views
6

Ich habe Probleme mit Timeouts einer Tabelle auf meiner.TSQL: Timeouts auf hohem Verkehr Tabelle

Beispieltabelle

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

ich Daten in diese Tabelle aus 2 verschiedenen gespeicherten Prozeduren eingefügt, die mit der Transaktion (mit spezifischer Eskalation) gewickelt sind und auch 1 Job, den alle 30 Sekunden einmal ausführt.

Ich erhalte Timeout von nur 1 von ihnen, und die seltsame Sache, dass seine von der einfachen

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 

Wenn etwas Verkehr dort auf dieser Tabelle ist (TempTable) Dieses Verfahren hält Timeout bekommen.

Ich überprüfte den Ausführungsplan und es scheint, dass ich keine Indizes in beiden gespeicherten Prozeduren verpasst habe.

Auch der einzige Index auf TempTable ist die gruppierte PK auf Id.

Irgendwelche Ideen?

Wenn mehr Informationen benötigt werden, sagen Sie es.

Die zweite gespeicherte Prozedur, die diese Tabelle verwendet, verursacht keine großen IO oder etwas.

Der Job verwendet jedoch eine atomare UPDATE für diese Tabelle und am Ende davon DELETE s aus der Tabelle, aber wie ich auf High IO dieser Tabelle überprüft, dauert der Job nicht länger als 3 Sekunden.

Danke.

+0

Ich glaube nicht, dass Sie eine Transaktion für eine einzelne Anweisung benötigen. Eine einzelne Anweisung wird erfolgreich sein oder nicht. – Paparazzi

Antwort

1

Es ist am wahrscheinlichsten, weil ein anderer Prozess Ihre Einfügeoperation blockiert, es könnte eine andere einfügen, löschen, aktualisieren oder einen Trigger oder eine andere SQL-Anweisung sein.

Um herauszufinden, wer Ihr Betrieb blockiert einige esaily avialable gespeicherte Prozeduren wie

  1. sp_who2
  2. sp_whoIsActive(Meine bevorzugte)

Während Ihre Insert-Anweisung zu sein verwenden können ausgeführt/aufgelegt Führen Sie eine dieser Prozeduren aus und sehen Sie, wer Sie blockiert.

In sp_who2 finden Sie eine Spalte mit dem Namen Blk_by sehen erhalten die SPID aus dieser Spalte und führen Sie die folgende Abfrage

DBCC INPUTBUFFER(71); 
GO 

Dies wird die letzte Abfrage von diesem Prozess-ID ausgeführt Reutrn . und es ist nicht sehr gut formatiert die SQL-Anweisung, alle die Abfrage wird in einer einzigen Zeile sein müssen Sie es in Ihrem SSMS formatieren, um es in der Lage zu lesen.

Auf der anderen Seite sp_WhoIsActive wird nur die Abfragen zurückgeben, die anderen Prozess blockieren und die Abfrage so formatiert haben, wie der Benutzer es ausgeführt haben. Außerdem erhalten Sie den Ausführungsplan für diese Abfrage.