(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 is when a thread is waiting to create the free space cache for a heap IN_ROW_DATA allocation unit, or any ROW_OVERFLOW_DATA or LOB_DATA allocation unit. When inserting into a heap or a LOB structure, the insertion point is determined by where there is enough free space (as there is no forced insertion point, like there is with a new index record), based on the approximate PFS free space tracking bits for the page. Rather than having to search through PFS pages for every insert, there is a small in-memory cache of PFS free-space values for pages that is scanned before an insertion. If a page with enough free space is not found, a new page is allocated. See here for more information on the PFS bits for a page.
(Books Online description: N/A)
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:
2012
Removed in SQL Server version:
N/A
Extended Events latch_class value:
Maps to the SPACEMGR_CREATE_FSC map_value in sys.dm_xe_map_values.
The map_key value in sys.dm_xe_map_values is 81 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.
Known occurrences in SQL Server (list number matches call stack list):
- Creating the free space cache for a LOB_DATA allocation unit (in this case, when inserting a new LOB value and finding that the free space cache doesn’t already exist)
And other similar call stacks.
Abbreviated call stacks (list number matches known occurrences list):
- LatchBase::Suspend+170b
LatchBase::AcquireInternal+3c9
AllocationCaches::CreateFreeSpacePageCache+6b
FreeSpaceScan::GetNextPageInternal+139
CompactSpaceAllocator::FindSpaceAndFixPageFast+1d4
CompactSpaceAllocator::FindSpaceAndFixPage+a5
BlobBase::AllocDataNode+27b
Blob::InsertNonFull+273
Blob::InsertWholePage+14e
Blob::Insert+33c
BlobManager::ReplaceAtWithILB+6e4
BlobManager::Copy+3d
PrepareIlbForSetData+303
LongRecord::PrepareNewColumns+8a0
LongRecord::SetDataInternal+205
LongRecord::SetData+26f
IndexDataSetSession::SetDataInternal+9e79
DatasetSession::SetData+123
RowsetNewSS::SetData+44
CMEDScanBase::FUpdateSingleRow+aa
CMEDScan::FUpdateRow+4c7
CMEDCatYukonObject::SetStatsBlob+2b6
CMEDProxyStats::SetBlob+196
CStatMan::PersistBlob+193