Digamos que eu tenha a seguinte configuração:
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
Eu gostaria de converter cada uma das colunas para varchar(max) assim:
-- processes every page:
alter table mytest
alter column Column1 varchar(max)
-- processes only metadata:
alter table mytest
alter column Column2 varchar(max)
Como posso demonstrar que o primeiro comando processa toda a tabela enquanto o segundo comando processa apenas metadados. Eu estava pensando em usar SET STATISTICS IO, que relata milhares de leituras lógicas para o primeiro comando e nada para o outro. Eu também estava pensando em usar DBCC LOG ou fn_dblog. Mas eu não tinha certeza de como interpretar ou vincular os resultados às consultas que fiz.
%%physloc%%
para encontrar um).last_lsn
a página.last_lsn
?Se for
last_lsn
alterado, o DDL é um tipo de alteração de tamanho dos dados, atualizações a cada registro. Selast_lsn
não mudou, obviamente, o DDL não atualizou todos os registros.Para uma maneira mais elaborada, você pode rastrear XEvents de gravação de página para uma única instrução (a DDL).
Aqui está o que eu criei: Se eu mudar para usar um banco de dados de teste (ou seja, [MyTest] em vez de [tempdb]), posso coletar o log de transações com:
E posso limpar esses logs a qualquer momento com:
Posso então executar minhas instruções alter table uma de cada vez e examinar seus efeitos no log de transações com:
Supondo que minha instrução seja a única instrução ALTER TABLE executada desde que limpei o log.