Как продемонстрировать активность журнала транзакций?

Скажем, у меня есть следующая настройка:

use tempdb
go

set nocount on
go

create table MyTest
(
    Column1 varchar(100),
    Column2 text 
)
go

insert mytest (Column1, Column2)
select REPLICATE('a', 100), REPLICATE('a', 100)
from sys.syscolumns a, sys.syscolumns b

Я хотел бы преобразовать каждый из столбцов в varchar (max) следующим образом:

-- processes every page:
alter table mytest
alter column Column1 varchar(max)

-- processes only metadata:
alter table mytest
alter column Column2 varchar(max)

Как я могу продемонстрировать, что первая команда обрабатывает всю таблицу, а вторая команда обрабатывает только метаданные. Я думал об использовании SET STATISTICS IO, который сообщает тысячи логических чтений для первой команды и ничего для другого. Я также думал об использовании DBCC LOG или fn_dblog. Но я не был уверен, как интерпретировать или привязывать результаты к запросам, которые я выпустил.

6 голосов | спросил Michael J Swart 1 PMpMon, 01 Apr 2013 19:07:08 +040007Monday 2013, 19:07:08

2 ответа


6
  • Выберите страницу, содержащую запись в вашей таблице (используйте %%physloc%% , чтобы найти его).
  • Запустите DBCC PAGE перед DDL, запишите last_lsn на странице.
  • Запустите DDL
  • Запустите снова страницу DBCC. Изменен ли last_lsn?

Если параметр last_lsn изменил DDL - это изменение размера данных, каждое из которых записано. Если код last_lsn не изменил, очевидно, DDL не обновлял каждую запись.

Для более сложного способа вы можете отслеживать страницу для записи XEvents для одного оператора (DDL).

ответил Remus Rusanu 1 PMpMon, 01 Apr 2013 19:48:24 +040048Monday 2013, 19:48:24
6

Вот что я придумал: если я переключусь на использование тестовой базы данных (т. е. [MyTest] вместо [tempdb]), то я могу собрать журнал транзакций с помощью:

-- start collecting TLogs:
ALTER DATABASE [Mytest] SET RECOVERY FULL WITH NO_WAIT
backup database [MyTest] to disk = 'nul:'

И я могу очистить эти журналы в любое время с помощью

-- clear Tlogs
checkpoint
backup log [mytest] to disk = 'nul:'

Затем я могу запускать свои инструкции alter table по одному и проверять их влияние на журнал транзакций с помощью:

-- Examine TLog for the above statement
declare @transactionId nvarchar(28)
select TOP 1 @transactionId = [Transaction Id]
from fn_dblog(null, null)
where [Transaction Name] = 'ALTER TABLE'

select count(1), AllocUnitName
from fn_dblog(null, null)
where [Transaction Id] = @transactionId
group by AllocUnitName

Предполагая, что мой оператор является единственным оператором ALTER TABLE, так как я очистил журнал.

ответил Michael J Swart 1 PMpMon, 01 Apr 2013 20:31:13 +040031Monday 2013, 20:31:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132