ACCESS_METHODS_HOBT_VIRTUAL_ROOT

(Republishing, or using this info in a commercial product/website, is prohibited without permission. All other uses are permitted. If in doubt, please ask.)

(Back to main page…)

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):

  1. Updating the root page ID (in this case, at the end of a bulk load operation)
  2. 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):

  1. 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
  2. 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