Data pages and index pages on data-only-locked tables have a row offset table that stores pointers to the starting byte for each row on the page. Each pointer takes 2 bytes.
Data and index rows are inserted on a page starting just after the page header, and fill in contiguously down the page. For all tables and indexes on data-only-locked tables, the row offset table begins at the last byte on the page, and grows upward.
The information stored for each row consists of the actual column data plus information such as the row number and the number of variable-length and null columns in the row. Index pages for allpages-locked tables do not have a row offset table.
Rows cannot cross page boundaries, except for text, image, and Java off-row columns. Each data row has at least 4 bytes of overhead; rows that contain variable-length data have additional overhead.
See Chapter 16, “Determining Sizes of Tables and Indexes,” for more information on data and index row sizes and overhead.
The row offset table stores pointers to the starting location for each data row on the page.