假设我有以下设置:
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。但我不确定如何解释或将结果与我发出的查询联系起来。
%%physloc%%
查找)。last_lsn
页面。last_lsn
改变?如果last_lsn
更改,则 DDL 是数据大小更新每条记录类型的更改。如果last_lsn
没有明显变化,DDL 不会更新每条记录。
对于更详细的方法,您可以跟踪单个语句(DDL)的页面写入 XEvent。
这是我的想法:如果我切换到使用测试数据库(即 [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 语句。