Tôi tiếp tục đọc trên nhiều diễn đàn và trên nhiều blog rằng một trang được bao gồm như dưới đây: Kích thước trang: 16 x 512B = 8192B Tiêu đề trang: = 96B Tối đa In_Row Row: = 8060B
Lá này (8192 - 96 - 8060) B = 36B.
Ok, điều này là hợp lý và chính xác. Câu hỏi tôi có là: tại sao nhiều người nói rằng 36B còn lại được dành riêng cho mảng slot?
Rõ ràng, mảng vị trí cho 2B mỗi hàng trên trang; vì vậy, nó có thể nhỏ bằng 2B và lớn bằng 1472B:
2B: 1 hàng * 2B = 2B
1472B: 8096B = n * 9B (kích thước hàng tối thiểu với chi phí ... nghĩ rằng cột TINYINT duy nhất) + n * 2B (chi phí mảng vị trí trên mỗi hàng) => 8096 = 11n => n = 8096/11 = 736.
736 * 2B = 1472B.
Điều này đưa tôi đến 20 do thẻ phiên bản 14B.
USE master ;
GO
CREATE DATABASE test ;
GO
USE test ;
GO
ALTER DATABASE test
SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO
ALTER DATABASE test
SET READ_COMMITTED_SNAPSHOT ON ;
GO
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i CHAR(8000) DEFAULT(REPLICATE('a',8000))
, j CHAR(53) DEFAULT(REPLICATE('a',53))
) ;
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
Một vi dụ khac. Nếu bạn đi đến 50 từ 49, bạn sẽ nhận được VARCHAR (MAX) tới LOB_DATA.
DROP TABLE tbl ;
GO
CREATE TABLE tbl
(
i VARCHAR(MAX) DEFAULT(REPLICATE('a',8000))
, j CHAR(49) DEFAULT(REPLICATE('a',49))
) ;
sp_tableoption N'tbl', 'large value types out of row', 'OFF' ;
GO
INSERT INTO tbl
DEFAULT VALUES ;
GO
DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO
Có vẻ như vấn đề này vẫn còn, ngay cả trong SQL Server 2012. @QueryKiwi chỉ ra bài đăng này của Kimberly Tripp - http://www.sqlskills.com/bloss/kimberly/a-simple-start-table-creation-best-practices / .