Hoje eu estava solucionando um problema no TempDB no SQL Server 2016 SP2 usando eventos estendidos e adicionei o evento mixed_extent_allocation e transaction_log ao meu rastreamento.
Eu esperava que mixed_extent_allocation não aparecesse nos meus resultados porque a seguinte consulta retornou 0 como resultado:
select is_mixed_page_allocation_on
from sys.databases
where database_id=2
Mas para minha surpresa este evento apareceu várias vezes. Isso foi precedido por um evento transaction_log com SGAM como contexto e operação LOP_SET_BITS.
Isso me deixou curioso e verifiquei o conteúdo da primeira página SGAM do TempdB:
DBCC TRACEON(3604)
dbcc page(tempdb,1,3,3)
DBCC TRACEOff(3604)
Este é um trecho do resultado:
╔═════════════════════════════════════════════╗
║ (1:0) - (1:176) = NOT ALLOCATED ║
║ (1:184) - = ALLOCATED ║
║ (1:192) - = NOT ALLOCATED ║
║ (1:200) - (1:208) = ALLOCATED ║
║ (1:216) - (1:256) = NOT ALLOCATED ║
║ (1:264) - = ALLOCATED ║
║ (1:272) - = NOT ALLOCATED ║
║ (1:280) - = ALLOCATED ║
║ (1:288) - (1:296) = NOT ALLOCATED ║
║ (1:304) - = ALLOCATED ║
║ (1:312) - = NOT ALLOCATED ║
║ (1:320) - = ALLOCATED ║
║ (1:328) - (1:336) = NOT ALLOCATED ║
║ (1:344) - = ALLOCATED ║
║ (1:352) - (1:65528) = NOT ALLOCATED ║
╚═════════════════════════════════════════════╝
Isso me fez concluir que extensões mistas ainda são usadas. Eu pensei que o SQL Server 2016 usa apenas extensões uniformes (exceto master, msdb e model). Ou minha conclusão está errada?
Por que ainda estou vendo o evento mixed_extent_allocation aparecendo?
De acordo com este post , as páginas do IAM ainda são alocadas de extensões mistas, mesmo no SQL Server 2016. Portanto, essa será a mixed_extent_allocation que vi no meu rastreamento.
A postagem no blog de Paul Randal fornece mais algumas explicações internas. Obrigado a Scott Hodgin por me indicar o artigo.
Pesquisei mais sobre o conteúdo das páginas alocadas na primeira página do SGAM e descobri que o SQL Server também usa extensões mistas para tabelas de sistema (object_id menor que 100).