Heaps are an interesting structure in SQL Server. Heaps aren’t really an index but just a collection of pages for storing data. One of the index maintenance tasks that will be a part of the next chapter is recovering space from heap tables. As will be more deeply discussed in that chapter, when rows are deleted from a heap, the pages associated with those rows are not removed from the heap. This is generally referred to as bloat within the heap.
An interesting side effect of the concept of heap bloat is the myth that bloat never gets reused. The space stays in the heap and is not recoverable until the heap is rebuilt. Fortunately, for heaps and database administrators, this isn’t the case. When data is removed from a heap, the space that the data previously held is made available for future inserts into the table.
To demonstrate how this works, you’ll build a table using the code in Listing 19. The demonstration creates a heap named MythEight and then inserts 400 records, which results in 100 pages of data. This page count can be validated with the page_count column in the first resultset in Figure 16. The next part of the script deletes every other row that was inserted into the heap. Generally, this should leave each page with half as many rows as it had previously, shown in the second result set in Figure 16. The last part of the script re-inserts 200 rows into the MythEight table, returning the row count to 400 records and reusing the previously used pages that had data removed from them. There is a slight growth in the page count from the last resultset in Figure 16, but most of the new rows fit into the space already allocated.
Listing 19. Reusing Data From the MythEight Heap
USE AdventureWorks2014 GO IF OBJECT_ID('dbo.MythEight') IS NOT NULL DROP TABLE dbo.MythEight; CREATE TABLE dbo.MythEight ( RowId INT IDENTITY(1,1) ,FillerData VARCHAR(2500) ); INSERT INTO dbo.MythEight (FillerData) SELECT TOP 400 REPLICATE('X',2000) FROM sys.objects; SELECT OBJECT_NAME(object_id), index_type_desc, page_count, record_count, forwarded_record_count FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID('dbo.MythEight'), NULL, NULL, 'DETAILED'); DELETE FROM dbo.MythEight WHERE RowId % 2 = 0; SELECT OBJECT_NAME(object_id), index_type_desc, page_count, record_count, forwarded_record_count FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID('dbo.MythEight'), NULL, NULL, 'DETAILED'); INSERT INTO dbo.MythEight (FillerData) SELECT TOP 200 REPLICATE('X',2000) FROM sys.objects; SELECT OBJECT_NAME(object_id), index_type_desc, page_count, record_count, forwarded_record_count FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID('dbo.MythEight'), NULL, NULL, 'DETAILED');

As the demonstration for this myth shows, space in a heap that previously held data is released for reuse by the table. For heaps that have a lot of data coming in and out of the table, there isn’t a significant need to monitor for page reuse, and the myth can be considered inaccurate. With heaps that have a lot of data removed without the intention to replace the data, you are able to recover the space with ALTER TABLE … REBUILD.
For all your application development needs, visit www.verbat.com for a fiscally conscious proposal that meets your needs ( So I can keep this blog going as well!!!!)
Alternatively click through the link if you found this article interesting. (This will help the companies Search engine rankings)
Leave a Reply