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:
- Utwórz bazę danych z plikiem dziennika, który zaczyna się od 1 MB, rośnie w 4 MB porcjach i ma maksymalny rozmiar 100 MB.
- Otwórz jawną transakcję, uruchom ją na 10 sekund, a następnie ręcznie anuluj w ramach SSMS
- Spójrz na liczbę fn_dblog () i rozmiar rezerwy dziennika i sprawdź DBCC SQLPERF (LOGSPACE)
Scenariusz 2:
- Utwórz bazę danych z plikiem dziennika, który zaczyna się od 1 MB, rośnie w 4 MB porcjach i ma maksymalny rozmiar 100 MB.
- Otwórz jawną transakcję, uruchom ją, aż wyświetli się komunikat o błędzie
- Spójrz na liczbę fn_dblog () i rozmiar rezerwy dziennika i sprawdź DBCC SQLPERF (LOGSPACE)
Wyniki Monitora wydajności:
Scenariusz 1:
Scenariusz 2:
Kod:
USE [master];
UDAĆ SIĘ
JEŚLI DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
ZACZYNAĆ
ALTER DATABASE [SampleDB] SET SINGLE_USER
Z NATYCHMIASTOWYMI ROLKAMI;
DROP DATABASE [SampleDB];
KONIEC;
UDAĆ SIĘ
UTWÓRZ BAZA DANYCH [SampleDB] NA PODSTAWIE
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, ROZMIAR = 3 MB
, FILEGROWTH = 1 MB
)
ZALOGOWAĆ SIĘ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, ROZMIAR = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
UDAĆ SIĘ
UŻYJ [SampleDB];
UDAĆ SIĘ
- Dodaj stolik
UTWÓRZ TABELĘ dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT DEPLICATE („a”, 8000)
) W dniu [PODSTAWOWY];
UDAĆ SIĘ
- Upewnij się, że nie jesteśmy pseudo prostym modelem odzyskiwania
KOPIA ZAPASOWA SampleDB
DO DYSKU = „NUL”;
UDAĆ SIĘ
- Utwórz kopię zapasową pliku dziennika
KOPIA ZAPASOWA SampleDB
DO DYSKU = „NUL”;
UDAĆ SIĘ
- Sprawdź używane miejsce na dziennik
DBCC SQLPERF (LOGSPACE);
UDAĆ SIĘ
- Ile rekordów jest widocznych za pomocą fn_dblog ()?
WYBIERZ * Z fn_dblog (NULL, NULL); - Około 9 w moim przypadku
/ **********************************
SCENARIUSZ 1
********************************** /
- Otwórz nową transakcję, a następnie wycofaj ją
ROZPOCZNIJ TRANSAKCJĘ
WPROWADŹ DO dbo.test WARTOŚCI DOMYŚLNE;
GO 10000 - Let jest uruchamiany przez 10 sekund, a następnie naciśnij przycisk Anuluj w oknie zapytania SSMS
- Anuluj transakcję
- Zakończenie zajmie kilka sekund
- Nie musisz cofać transakcji, ponieważ anulowanie już to zrobiło.
-- Po prostu spróbuj. Otrzymasz ten błąd
- Msg 3903, poziom 16, stan 1, wiersz 1
- Żądanie TRANSAKCJI ROLLBACK nie ma odpowiadającej POCZĄTKU TRANSAKCJI.
TRANSAKCJA ROLKOWA;
- Jaka jest używana przestrzeń dziennika? Powyżej 100%.
DBCC SQLPERF (LOGSPACE);
UDAĆ SIĘ
- Ile rekordów jest widocznych za pomocą fn_dblog ()?
WYBIERZ *
FN_dblog (NULL, NULL); - Około 91 926 w moim przypadku
- Całkowita rezerwa dziennika pokazana przez fn_dblog ()?
SELECT SUM ([Log Log]) AS [Total Log Reserve]
FN_dblog (NULL, NULL); - Około 88,72 MB
/ **********************************
SCENARIUSZ 2
********************************** /
- Zdmuchnij DB i zacznij od nowa
USE [master];
UDAĆ SIĘ
JEŚLI DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
ZACZYNAĆ
ALTER DATABASE [SampleDB] SET SINGLE_USER
Z NATYCHMIASTOWYMI ROLKAMI;
DROP DATABASE [SampleDB];
KONIEC;
UDAĆ SIĘ
UTWÓRZ BAZA DANYCH [SampleDB] NA PODSTAWIE
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, ROZMIAR = 3 MB
, FILEGROWTH = 1 MB
)
ZALOGOWAĆ SIĘ
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, ROZMIAR = 1 MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4 MB
);
UDAĆ SIĘ
UŻYJ [SampleDB];
UDAĆ SIĘ
- Dodaj stolik
UTWÓRZ TABELĘ dbo.test
(
c1 CHAR (8000) NOT NULL DEFAULT DEPLICATE („a”, 8000)
) W dniu [PODSTAWOWY];
UDAĆ SIĘ
- Upewnij się, że nie jesteśmy pseudo prostym modelem odzyskiwania
KOPIA ZAPASOWA SampleDB
DO DYSKU = „NUL”;
UDAĆ SIĘ
- Utwórz kopię zapasową pliku dziennika
KOPIA ZAPASOWA SampleDB
DO DYSKU = „NUL”;
UDAĆ SIĘ
- Teraz wysadźmy plik dziennika w ramach naszej transakcji
ROZPOCZNIJ TRANSAKCJĘ
WPROWADŹ DO dbo.test WARTOŚCI DOMYŚLNE;
GO 10000
- Cofanie nigdy nie działa. Spróbuj. Otrzymasz błąd.
- Msg 3903, poziom 16, stan 1, wiersz 1
- Żądanie TRANSAKCJI ROLLBACK nie ma odpowiadającej POCZĄTKU TRANSAKCJI.
TRANSAKCJA ROLKOWA;
- Czy plik dziennika jest w 100% pełny?
DBCC SQLPERF (LOGSPACE);
- Ile rekordów jest widocznych za pomocą fn_dblog ()?
WYBIERZ *
FN_dblog (NULL, NULL); - Około 91 926 w moim przypadku
UDAĆ SIĘ
- Całkowita rezerwa dziennika pokazana przez fn_dblog ()?
SELECT SUM ([Log Log]) AS [Total Log Reserve]
FN_dblog (NULL, NULL); - 88,72 MB
UDAĆ SIĘ