(Republishing, or using this info in a commercial product/website, is prohibited without permission. All other uses are permitted. If in doubt, please ask.)
Description:
This latch class is when a thread is waiting for access to the in-memory metadata entry containing a B-tree’s root page ID. EX access is required to change the root page ID, which typically happens when a B-tree becomes a level deeper during heavy insertions into a new index and the existing root page has to split. Every B-tree traversal has to start at the root page, which requires obtaining this latch in SH mode.
(Books Online description: “Used to synchronize access to the root page abstraction of an internal B-tree.”)
Questions/comments on this latch class? Click here to send Paul an email, especially if you have any information to add to this topic.
Added in SQL Server version:
pre-2005/2005
Removed in SQL Server version:
N/A
Extended Events latch_class value:
Maps to the HOBT_VIRTUAL_ROOT map_value in sys.dm_xe_map_values.
The map_key value in sys.dm_xe_map_values is 11 in 2008 and 2008 R2, and 5 in 2012 and 2014 RTM. After 2014 RTM, you must check the DMV to get the latest value as some map_key values have changed in later builds.
Other information:
I have not seen this latch be a noticeable contention point, except temporarily when a new index has been added to a table with a large number of concurrent inserters, as the EX latch will be required occasionally (as described above).
See the LATCH_EX wait type for more information about latches in general and how to troubleshoot them.
Known occurrences in SQL Server (list number matches call stack list):
- Updating the root page ID (in this case, at the end of a bulk load operation)
- Reading the root page ID (in this case, to begin an index traversal to find the insertion point for a new index record)
And many more similar stacks.
Abbreviated call stacks (list number matches known occurrences list):
- XeSqlPkg::latch_suspend_end::Publish+138
LatchBase::Suspend+16b8
LatchBase::AcquireInternal+415
LatchBase::AcquireAllSublatches+29b
LatchBase::AcquireInternal+2ee
RowsetBulk::UpdateHoBtPageIds+71
RowsetBulk::EndUpdate+162
CEndUpdate::EndUpdate+d
CQScanUpdateNew::GetRow+84e
CQScanXProducerNew::GetRowHelper+366
CQScanXProducerNew::GetRow+15
FnProducerOpen+57
FnProducerThread+8c3
SubprocEntrypoint+a7f
SOS_Task::Param::Execute+21e
SOS_Scheduler::RunTask+a8 - XeSqlPkg::latch_suspend_end::Publish+138
LatchBase::Suspend+16b8
LatchBase::AcquireInternal+415
HoBtAccess::GetVirtualRootWithLatch+48
BTreeMgr::HandleRoot+105
BTreeMgr::Seek+248
BTreeMgr::GetHPageIdWithKey+32d
IndexPageManager::GetPageWithKey+ec
IndexDataSetSession::LocatePageForInsert+204
IndexDataSetSession::InsertSmallRecord+cd2
IndexDataSetSession::InsertRowInternal+2de1
DatasetSession::InsertRow+163
RowsetNewSS::InsertRow+26
CValRow::SetDataX+5b