Я попробовал следующий эксперимент и получил похожие результаты. В обоих случаях fn_dblog () показывает, что происходит откат, и в сценарии 2 это происходит быстрее, чем в сценарии 1.
Кстати, я поместил и MDF, и LDF на один и тот же внешний (USB 2.0) диск.
Мой первоначальный вывод состоит в том, что в этом случае нет разницы в операции отката, и, вероятно, любая очевидная разница в скорости связана с подсистемой ввода-вывода. Это только моя рабочая гипотеза на данный момент.
Сценарий 1:
- Создайте базу данных с файлом журнала, который начинается с 1 МБ, увеличивается до 4 МБ и имеет максимальный размер 100 МБ.
- Откройте явную транзакцию, запустите ее на 10 секунд, а затем вручную отмените в SSMS.
- Посмотрите на число fn_dblog () и резервный размер журнала и проверьте DBCC SQLPERF (LOGSPACE)
Сценарий 2:
- Создайте базу данных с файлом журнала, который начинается с 1 МБ, увеличивается до 4 МБ и имеет максимальный размер 100 МБ.
- Откройте явную транзакцию и выполняйте ее до тех пор, пока не заполнится журнал.
- Посмотрите на число fn_dblog () и резервный размер журнала и проверьте DBCC SQLPERF (LOGSPACE)
Результаты монитора производительности:
Сценарий 1:
Сценарий 2:
Код:
ИСПОЛЬЗОВАТЬ [мастер];
ИДТИ
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
НАЧАТЬ
ALTER DATABASE [SampleDB] SET SINGLE_USER
С немедленным отступлением;
DROP DATABASE [SampleDB];
КОНЕЦ;
ИДТИ
СОЗДАТЬ БАЗУ ДАННЫХ [SampleDB] НА ПЕРВИЧНОЙ
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, РАЗМЕР = 3 МБ
, FILEGROWTH = 1 МБ
)
ВХОД
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, РАЗМЕР = 1 МБ
MAXSIZE = 100 МБ
, FILEGROWTH = 4 МБ
);
ИДТИ
USE [SampleDB];
ИДТИ
- Добавить таблицу
CREATE TABLE dbo.test
(
c1 CHAR (8000) NOT NULL ПО УМОЛЧАНИЮ (по умолчанию, 8000)
) НА [ПЕРВИЧНО];
ИДТИ
- Убедитесь, что мы не псевдо-простая модель восстановления
РЕЗЕРВНАЯ БАЗА ДАННЫХ SampleDB
TO DISK = 'NUL';
ИДТИ
- Резервное копирование файла журнала
РЕЗЕРВНЫЙ ЛОГ SampleDB
TO DISK = 'NUL';
ИДТИ
- Проверьте используемое пространство журнала
DBCC SQLPERF (LOGSPACE);
ИДТИ
- Сколько записей видно с помощью fn_dblog ()?
SELECT * FROM fn_dblog (NULL, NULL); - около 9 в моем случае
/ **********************************
СЦЕНАРИЙ 1
********************************** /
- Откройте новую транзакцию, а затем откатите ее
НАЧАЛО СДЕЛКИ
INSERT INTO dbo.test DEFAULT VALUES;
GO 10000 - пусть выполняется в течение 10 секунд, а затем нажмите отмену в окне запроса SSMS
- отменить транзакцию
- Это должно занять пару секунд, чтобы закончить
- Нет необходимости откатывать транзакцию, так как отмена уже сделала это для вас.
-- Просто попробуйте. Вы получите эту ошибку
- Сообщение 3903, уровень 16, состояние 1, строка 1
- Запрос ROLLBACK TRANSACTION не имеет соответствующей BEGIN TRANSACTION.
ROLLBACK TRANSACTION;
- Какое место занимает журнал? Выше 100%.
DBCC SQLPERF (LOGSPACE);
ИДТИ
- Сколько записей видно с помощью fn_dblog ()?
ВЫБРАТЬ *
FROM fn_dblog (NULL, NULL); - Около 91 926 в моем случае
Общий резерв журнала, показанный fn_dblog ()?
ВЫБЕРИТЕ СУММУ ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - около 88,72 МБ
/ **********************************
СЦЕНАРИЙ 2
********************************** /
- сдуть БД и начать все сначала
ИСПОЛЬЗОВАТЬ [мастер];
ИДТИ
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
НАЧАТЬ
ALTER DATABASE [SampleDB] SET SINGLE_USER
С немедленным отступлением;
DROP DATABASE [SampleDB];
КОНЕЦ;
ИДТИ
СОЗДАТЬ БАЗУ ДАННЫХ [SampleDB] НА ПЕРВИЧНОЙ
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, РАЗМЕР = 3 МБ
, FILEGROWTH = 1 МБ
)
ВХОД
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, РАЗМЕР = 1 МБ
MAXSIZE = 100 МБ
, FILEGROWTH = 4 МБ
);
ИДТИ
USE [SampleDB];
ИДТИ
- Добавить таблицу
CREATE TABLE dbo.test
(
c1 CHAR (8000) NOT NULL ПО УМОЛЧАНИЮ (по умолчанию, 8000)
) НА [ПЕРВИЧНО];
ИДТИ
- Убедитесь, что мы не псевдо-простая модель восстановления
РЕЗЕРВНАЯ БАЗА ДАННЫХ SampleDB
TO DISK = 'NUL';
ИДТИ
- Резервное копирование файла журнала
РЕЗЕРВНЫЙ ЛОГ SampleDB
TO DISK = 'NUL';
ИДТИ
- Теперь давайте взорвем файл журнала в нашей транзакции
НАЧАЛО СДЕЛКИ
INSERT INTO dbo.test DEFAULT VALUES;
GO 10000
- Откат никогда не срабатывает. Попытайся. Вы получите ошибку.
- Сообщение 3903, уровень 16, состояние 1, строка 1
- Запрос ROLLBACK TRANSACTION не имеет соответствующей BEGIN TRANSACTION.
ROLLBACK TRANSACTION;
- Файл журнала заполнен на 100%?
DBCC SQLPERF (LOGSPACE);
- Сколько записей видно с помощью fn_dblog ()?
ВЫБРАТЬ *
FROM fn_dblog (NULL, NULL); - Около 91 926 в моем случае
ИДТИ
Общий резерв журнала, показанный fn_dblog ()?
ВЫБЕРИТЕ СУММУ ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - 88,72 МБ
ИДТИ