(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 representation of a HoBt (Heap-or-Btree) so that it can initialize/reinitialize it from metadata. The HoBt structure includes things like the list of columns, columns offsets, page and record counts, and allocation unit information (in-row data, LOB, row-overflow).
(Books Online description: “Used to synchronize access to the in-memory representation of a HoBt.”)
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 map_value in sys.dm_xe_map_values.
The map_key value in sys.dm_xe_map_values is 9 in 2008 and 2008 R2, and 3 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.
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):
- Refresh a HoBt structure (in this case, for a system table scan while looking up an object so a query can bind to it)
- Refresh a HoBt structure (in this case, for a system table scan looking for Service Broker queues that support internal activation)
And many more similar stacks that end in a HoBt structure being initialized/reinitialized.
Abbreviated call stacks (list number matches known occurrences list):
- XeSqlPkg::latch_suspend_end::Publish+138
LatchBase::Suspend+16b8
LatchBase::AcquireInternal+415
VisibleHoBt::Refresh+75
HoBtFactory::GetHoBtAccess+a98
GetRowsetProperties+177
RowsetNewSS::Init+26e
OpenRowsetSS::OpenRowset+10f
OpenSystemTableRowset+2c7
CMEDScanBase::Rowset+57d
CMEDScan::StartSearch+4e7
CMEDCatYukonObject::FLookupObjectFromId+25f
CMEDCatalogObject::GetCachedObjectById+15c
CMEDCatalogObject::GetCachedObjectByName+81
CMEDProxySchema::GetObjectByName+82
GetSystemObject+253
IMetadataAccess::GetMultiNameObjectHelper+69c
CMEDAccess::GetMultiNameObject+df
CAlgTableMetadata::FPartialBind+796
CAlgTableMetadata::Bind+31d
CRelOp_Get::BindTree+429
COptExpr::BindTree+85
CRelOp_FromList::BindTree+37
COptExpr::BindTree+85 - XeSqlPkg::latch_suspend_end::Publish+138
LatchBase::Suspend+16b8
LatchBase::AcquireInternal+415
VisibleHoBt::Refresh+75
HoBtFactory::GetHoBtAccess+a98
GetRowsetProperties+177
RowsetNewSS::Init+26e
OpenRowsetSS::OpenRowset+10f
OpenSystemTableRowset+2c7
CMEDScanBase::Rowset+57d
CMEDScan::StartSearch+4e7
ECatBitsYukon::GetNextSchemaObjectId+ac
CMEDCatSB::GetNextServiceId+bf
CMEDProxyDatabase::FGetNextServiceId+36
CSbMappingMgr::NotifyBrokerInitialize+31d
CActiveServiceBroker::BackgroundNotify+14b
CActiveServiceBrokerMgr::ASBInitializer+19b
CActiveServiceBrokerMgr::CSbASBInitializer::IdempotentInvoke+26
CSbTaskManager::HandleReusableTask+2b8
CSbTask::TaskStart+14b
CSbTask::BeginTaskStart+17
SOS_Task::Param::Execute+21e
SOS_Scheduler::RunTask+ab