W SQL Server 2008 R2 czym różnią się te dwa wycofania:
Uruchom
ALTER
instrukcję przez kilka minut, a następnie naciśnij „Anuluj wykonywanie”. Całkowite cofnięcie zajmuje kilka minut.Uruchom tę samą
ALTER
instrukcję, ale upewnij się, żeLDF
plik nie jest wystarczająco duży, aby mógł zakończyć się powodzeniem. Po osiągnięciuLDF
limitu i braku zezwolenia na „autogrowth” wykonywanie zapytania zatrzymuje się natychmiast (lub następuje wycofanie) z komunikatem o błędzie:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
Czym różnią się te dwa punkty w następujących punktach?
Dlaczego drugie „wycofanie” jest natychmiastowe? Nie jestem do końca pewien, czy można to nazwać wycofaniem. Domyślam się, że dziennik transakcji jest zapisywany w miarę postępu wykonywania, a gdy zorientuje się, że nie ma wystarczającej ilości miejsca do pełnego wykonania zadania, po prostu zatrzymuje się z komunikatem „koniec”, bez zatwierdzania.
Co się stanie, gdy pierwsze wycofanie zajmie tyle czasu (czy wycofanie jest jednowątkowe)?
2.1 Czy program SQL Server cofnie się i cofnie wpisy wprowadzone wLDF
pliku?
2.2 RozmiarLDF
pliku zmniejsza się na końcu przywracania (odDBCC SQLPERF(LOGSPACE)
)Jedno dodatkowe pytanie: w drugim scenariuszu SQL Server
LDF
dość szybko zaczyna pobierać pliki. W moim przypadku wzrósł z 18% do 90% w ciągu pierwszych kilku minut (<4 min). Ale kiedy osiągnęło 99%, pozostało tam przez kolejne 8 minut, przy zmiennym zużyciu od 99,1% do 99,8%. Zwiększa się (99,8%) i zmniejsza (99,2%) i ponownie rośnie (99,7%) i spada (99,5%) kilka razy przed zgłoszeniem błędu. Co dzieje się za kulisami?
Doceniamy wszelkie linki MSDN, które mogłyby pomóc w wyjaśnieniu tego bardziej.
Zgodnie z sugestią Ali Razeghi dodaję perfmon: Disk Bytes/sec
Odpowiedzi:
Jak wskazano powyżej, po przeprowadzeniu większej liczby testów doszedłem do obliczonych wniosków. Podsumowałem je wszystkie w blogu tutaj , ale skopiuję trochę treści do tego postu dla potomności.
Domysł (na podstawie niektórych testów)
Na razie nie mam jasnego wyjaśnienia, dlaczego tak jest. Ale poniżej są moje szacunki na podstawie artefaktów zebranych podczas testów.
Wycofywanie ma miejsce w obu scenariuszach. Jeden jest jawnym wycofaniem (użytkownik naciska przycisk Anuluj), drugi jest niejawny (serwer Sql podejmuje tę decyzję wewnętrznie).
W obu scenariuszach ruch do pliku dziennika jest spójny. Zobacz zdjęcia poniżej:
Scenariusz 1:
Scenariusz 2:
Jednym artefaktem, który wzmocnił ten tok myślenia, jest uchwycenie śladu sql podczas obu scenariuszy.
Niewyjaśnione zachowanie:
Wszelkie pomysły, które pomogą lepiej wyjaśnić to zachowanie, są mile widziane.
źródło
Próbowałem następującego eksperymentu i uzyskałem podobne wyniki. W obu przypadkach fn_dblog () pokazuje wycofywanie i wydaje się, że dzieje się to szybciej w Scenariuszu 2 niż w Scenariuszu 1.
Nawiasem mówiąc, umieściłem zarówno MDF, jak i LDF na tym samym pojedynczym zewnętrznym dysku (USB 2.0).
Mój wstępny wniosek jest taki, że w tym przypadku nie ma różnicy w działaniu wycofania i prawdopodobnie każda widoczna różnica prędkości jest związana z podsystemem I / O. To tylko moja robocza hipoteza.
Scenariusz 1:
Scenariusz 2:
Wyniki Monitora wydajności:
Scenariusz 1:
Scenariusz 2:
Kod:
źródło