Czy odpalenie na czas nieokreślony WAITFOR zwiększa rozmiar pliku dziennika?

16

W ostatniej wersji mojej aplikacji dodałem polecenie, które każe czekać, aż coś dotrze do kolejki Service Broker:

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

DBA mówią mi, że od momentu dodania rozmiary kłód przeszły przez dach. Czy to może być poprawne? A może powinienem szukać gdzie indziej?

AngryHacker
źródło

Odpowiedzi:

17

Każda aktywna otwarta transakcja przypina dziennik, zapobiegając obcięciu i ostatecznie powodując wzrost. Jeśli rozpoczniesz transakcję, napisz do dziennika, a następnie poczekaj wiecznie, mając nadzieję, że wiadomość w końcu cię obudzi, po prostu przypięłaś dziennik i spowoduje jego wzrost.

Ostatnio zacząłem polecać ludziom unikanie WAITFOR w aktywowanej procedurze wraz z pętlą. Po prostu wydaj ODBIÓR i gotowe, pozwól mechanizmowi aktywacji zapętlić się (zrobi to) i nie czekaj, po prostu ODBIERZ.

Smak ODBIORU WAITFOR tworzy wewnętrznie punkt zapisu. Generuje to dziennik (co najmniej 3 rekordy dziennika) i rzeczywiście przypina dziennik w miejscu podczas oczekiwania. Długa przerwa WAITFOR (lub, co gorsza, nieskończona) byłaby bardzo złą praktyką.

Remus Rusanu
źródło
1
By WAITFOR (...) TIMEOUT 3600000rozwiązać problem? Np. Zwolnij co godzinę.
AngryHacker,
2
Twój dziennik wzrośnie dużo w ciągu jednej godziny. WAITFOR (REC EIVE) jest przeznaczony na interwały takie jak 5 sekund ...
Remus Rusanu,
1
Powinieneś także sprawdzić, dlaczego Twoja transakcja jest faktycznie aktywna (zapisał dziennik). Typowy wzorzec Service Broker nie wydaje żadnych zapisów przed ODBIERANIEM.
Remus Rusanu,
1
Nie rozumiem twojego ostatniego komentarza. Transakcja jest aktywna, ponieważ wydałem WAITFOR (RECEIVE...Czy możesz ją rozwinąć? Być może źle zrozumiałem.
AngryHacker,
8
begin transaction; waitfor(receive...)nie wygeneruje żadnych zapisów dziennika (nie „aktywuje” transakcji) podczas oczekiwania, a zatem nie przypina dziennika. Tylko begin transaction;[insert|update|delete];waitfor(receive...)spowoduje, że transakcja „aktywuje się” (generuje rekordy dziennika), a tym samym faktycznie przypina dziennik podczas oczekiwania.
Remus Rusanu,
5

Na SQL Server 2008 R2, jeśli wykonam WAITFOR (ODBIERZ), a następnie uruchomię DBCC OPENTRAN, pokazuje transakcję jako aktywną, nawet przy braku wcześniejszych aktualizacji.

Nigel Pattinson
źródło
2
Prawidłowo, WAITFOR tworzy punkt zapisu wewnętrznie, co powoduje zapis dziennika, więc przypina dziennik w miejscu.
Remus Rusanu,
@RemusRusanu, czy nie przeczy to wcześniejszym komentarzom do drugiej odpowiedzi ?
binki,
@binki ten komentarz odnosi się do SQL Server 2005. To jest dla 2008 R2. Zachowują się inaczej w tej kwestii, jeśli dobrze pamiętam.
Remus Rusanu,