假设我有以下设置:
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。但我不确定如何解释结果或将结果与我发出的查询联系起来。
%%physloc%%
查找)。last_lsn
页面。last_lsn
?如果
last_lsn
更改的 DDL 是数据大小更新每条记录的一种更改。如果last_lsn
没有变化,显然 DDL 不会更新每条记录。对于更详细的方法,您可以跟踪单个语句(DDL)的页面写入 XEvents。
这是我的想法:如果我切换到使用测试数据库(即 [MyTest] 而不是 [tempdb]),那么我可以使用以下方法收集事务日志:
我可以随时通过以下方式清除这些日志:
然后我可以一次一个地运行我的 alter table 语句并检查它们对事务日志的影响:
假设我的语句是自从我清除日志后唯一运行的 ALTER TABLE 语句。