2014-05-15 11 views
6

Mam problemy z przekroczeniem limitu czasu tabeli przy kopalni.TSQL: Przekroczenie limitu czasu na stole o dużym natężeniu ruchu

Przykład tabeli:

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

ja wstawiania danych do tabeli z 2 różnych procedur przechowywanych są zawijane z transakcji (ze szczególnym nasileniem), a także jedno zadanie, które wykonuje się raz na 30 sekund.

Dostaję limitu czasu z tylko 1 z nich, a dziwne, że jej z prostego jednego

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 

gdy istnieje jakiś ruch w tej tabeli (TempTable) Procedura ta zachowuje się limit czasu.

Sprawdziłem plan wykonania i wygląda na to, że nie pominięto żadnych indeksów w obu procedurach przechowywanych.

Ponadto jedynym indeksem na TempTable jest klaster PK na Id.

Wszelkie pomysły?

Jeśli potrzebujesz więcej informacji, powiedz to.

Druga procedura przechowywana za pomocą tej tabeli nie powoduje żadnego dużego IO lub czegoś takiego.

Zlecenie używa jednak atomowego UPDATE na tym stole, a na końcu DELETE s z tabeli, ale ponieważ sprawdziłem na wysokim IO tej tabeli, zadanie nie trwa dłużej niż 3 sekundy.

Dzięki.

+0

Nie sądzę, że potrzebujesz transakcji na jednym wyciągu. Pojedyncza instrukcja zakończy się pomyślnie lub nie. – Paparazzi

Odpowiedz

1

Jest to najbardziej prawdopodobne, ponieważ niektóre inne procesy blokują operację wstawiania. Może to być kolejna wstawka, usunięcie, aktualizacja lub jakiś wyzwalacz lub jakakolwiek inna instrukcja SQL.

Aby dowiedzieć się, kto blokuje działanie można korzystać z niektórych esaily avialable procedur składowanych jak

  1. sp_who2
  2. sp_whoIsActive(mój ulubiony)

Podczas gdy oświadczenie wkładka jest bycie Wykonane/rozłączone wykonaj jedną z tych procedur i zobacz, kto Cię blokuje.

W sp_who2 widać kolumnę o nazwie Blk_by uzyskać SPID z tej kolumny i wykonać następujące zapytanie

DBCC INPUTBUFFER(71); 
GO 

Będzie reutrn ostatnią kwerendy wykonywane przez ten identyfikator procesu . i nie jest dobrze sformatowana instrukcja sql, wszystkie zapytania będą w jednym wierszu, musisz sformatować go w SSMS, aby móc go odczytać.

Z drugiej strony sp_WhoIsActive zwróci tylko kwerendy, które blokują inny proces i będą miały sformatowane zapytanie tak samo, jak użytkownik je wykonał. Również da ci plan wykonania dla tego zapytania.