HiveBrain v1.2.0
Get Started
← Back to all entries
patternMinor

Page Split Timing

Submitted by: @import:stackexchange-dba··
0
Viewed 0 times
timingsplitpage

Problem

So, imagine I have a page that I intend to cause to split.


USE master ;
GO

IF DATABASEPROPERTYEX (N'Pages', N'Version') > 0
BEGIN
ALTER DATABASE Pages SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE Pages ;
END
GO

CREATE DATABASE Pages ;
GO

IF EXISTS(SELECT object_id FROM sys.objects WHERE name = 'PageSplit')
BEGIN
DROP TABLE PageSplit ;
END

USE Pages ;
GO

CREATE TABLE PageSplit
(
c1 INT IDENTITY
, c2 VARCHAR(2000) DEFAULT REPLICATE('b' , 1000)
) ;
GO

CREATE UNIQUE CLUSTERED INDEX CIX_c1
ON dbo.PageSplit
(
[c1] ASC
) ;
GO

INSERT INTO PageSplit DEFAULT VALUES ;
GO 7

DBCC IND(Pages,PageSplit,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE (Pages,1,231,3) ;
GO
-- m_freeCnt = 977

At this point, I need only update a row like so and I get a split: 3 rows to one page, 4 to the other:

UPDATE PageSplit
SET c2 = REPLICATE('b' , 2000)
WHERE c1 = 1 ;
GO

So, my question is this: when does the update happen: before or after the page split? I assume that it occurs after the split.

I have attached the output of SQL Profiler and DBCC IND. Just a side note, the updated row remained on the original page.

I applied SQL Kiwi's advice. See the results here:

Solution

The UPDATE would happen after the split because from a data state perspective, SQL Server will never overwrite another currently-allocated row in the process.

Moreover, if SQL Server did overwrite a portion of another row, and that row had to be moved, it wouldn't know what data to copy to the new page. A copy of the row could be kept in a temporary buffer in memory... which... is the very definition of a data page.

And so the splitting process goes as follows:

  • Allocate a new page



  • Copy the split rows to the new page



  • Deallocate the split rows from the original page



  • Did we reach at least the target amount of free space? If yes, we're done; if no, split again.



Finally, the UPDATE occurs, which is always free to overwrite unallocated portions of the page.

Context

StackExchange Database Administrators Q#20752, answer score: 3

Revisions (0)

No revisions yet.