今天我正在使用扩展事件解决 SQL Server 2016 SP2 上 TempDB 的问题,并将 mixed_extent_allocation 和 transaction_log 事件添加到我的跟踪中。
我预计 mixed_extent_allocation 不会出现在我的结果中,因为以下查询返回 0 作为结果:
select is_mixed_page_allocation_on
from sys.databases
where database_id=2
但令我惊讶的是,这个事件出现了好几次。这之前是一个以 SGAM 作为上下文和操作 LOP_SET_BITS 的 transaction_log 事件。
这让我很好奇,于是查看了TempdB第一个SGAM页面的内容:
DBCC TRACEON(3604)
dbcc page(tempdb,1,3,3)
DBCC TRACEOff(3604)
这是结果的一个片段:
╔═════════════════════════════════════════════╗
║ (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 ║
╚═════════════════════════════════════════════╝
这让我得出结论,仍然使用混合范围。我以为SQL Server 2016 只使用统一范围(master、msdb 和 model 除外)。还是我的结论有误?
为什么我仍然看到 mixed_extent_allocation 事件弹出?
根据这篇文章,IAM 页面仍然是从混合范围分配的,即使在 SQL Server 2016 中也是如此。所以这将是我在跟踪中看到的 mixed_extent_allocation。
Paul Randal的博文提供了更多内部解释。感谢 Scott Hodgin 指点我这篇文章。
我对第一个 SGAM 页面中分配的页面内容进行了更多研究,发现 SQL Server 也对系统表(object_id 低于 100)使用混合区。