Slot Array và Tổng kích thước trang


13

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 / .


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


8

Trong đó các trang được sử dụng cho các mục đích nội bộ như sắp xếp chạy, kích thước hàng tối đa là 8094 byte . Đối với các trang dữ liệu, kích thước liên tiếp tối đa bao gồm cả chi phí hàng bên trong là 8060 byte .

Chi phí hàng bên trong có thể mở rộng đáng kể nếu một số tính năng động cơ đang được sử dụng. Ví dụ: sử dụng các cột thưa thớt làm giảm kích thước dữ liệu người dùng có thể truy cập xuống còn 8019 byte.

Ví dụ duy nhất về chi phí hàng bên ngoài mà tôi biết lên đến SQL Server 2012 là 14 byte cần thiết cho các hàng được phiên bản . Chi phí bên ngoài này mang lại mức sử dụng không gian tối đa cho một hàng đơn tới 8074 byte, cộng với 2 byte cho mục nhập mảng khe đơn, tạo ra tổng số 8076 byte. Đây vẫn là 20 byte ngắn so với giới hạn 8096 (kích thước trang 8192 - tiêu đề cố định 96 byte).

Các khả năng giải thích hầu hết là giới hạn 8060 byte gốc trái 34 byte cho việc mở rộng trong tương lai, trong đó 14 đã được sử dụng để thực hiện hàng-versioning.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.