如何演示事务日志活动?

Mic*_*art 6 sql-server

假设我有以下设置:

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
Run Code Online (Sandbox Code Playgroud)

我想将每一列转换为 varchar(max) ,如下所示:

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

-- processes only metadata:
alter table mytest
alter column Column2 varchar(max)
Run Code Online (Sandbox Code Playgroud)

我如何证明第一个命令处理整个表而第二个命令只处理元数据。我正在考虑使用 SET STATISTICS IO,它报告第一个命令的数千个逻辑读取,而另一个没有报告。我也在考虑使用 DBCC LOG 或 fn_dblog。但我不确定如何解释或将结果与我发出的查询联系起来。

Rem*_*anu 6

  • 选择包含表中记录的页面(用于%%physloc%%查找)。
  • 在 DDL 之前运行 DBCC PAGE,记下last_lsn页面。
  • 运行你的 DDL
  • 再次运行 DBCC PAGE。做了last_lsn改变?

如果last_lsn更改,则 DDL 是数据大小更新每条记录类型的更改。如果last_lsn没有明显变化,DDL 不会更新每条记录。

对于更详细的方法,您可以跟踪单个语句(DDL)的页面写入 XEvent。


Mic*_*art 6

这是我的想法:如果我切换到使用测试数据库(即 [MyTest] 而不是 [tempdb]),那么我可以收集事务日志:

-- start collecting TLogs:
ALTER DATABASE [Mytest] SET RECOVERY FULL WITH NO_WAIT
backup database [MyTest] to disk = 'nul:'
Run Code Online (Sandbox Code Playgroud)

我可以随时清除这些日志:

-- clear Tlogs
checkpoint
backup log [mytest] to disk = 'nul:'
Run Code Online (Sandbox Code Playgroud)

然后,我可以一次运行一个 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
Run Code Online (Sandbox Code Playgroud)

假设我的语句是自我清除日志以来唯一运行的 ALTER TABLE 语句。