Slot Array dan Ukuran Halaman Total


13

Saya terus membaca di banyak forum dan di banyak blog bahwa halaman terdiri seperti yang ditunjukkan di bawah ini: Ukuran Halaman: 16 x 512B = 8192B Header Halaman: = 96B Maksimum Baris Baris In_Row: = 8060B

Ini meninggalkan (8192 - 96 - 8060) B = 36B.

Ok, ini logis dan benar. Pertanyaan saya adalah ini: mengapa begitu banyak orang mengatakan bahwa 36B sisanya dicadangkan untuk slot array?

Jelas, slot array memberikan 2B per baris pada halaman; jadi, bisa sekecil 2B dan sebesar 1472B:

2B: 1 baris * 2B = 2B

1472B: 8096B = n * 9B (ukuran baris min dengan overhead ... pikirkan kolom TINYINT tunggal) + n * 2B (biaya array slot per baris) => 8096 = 11n => n = 8096/11 = 736.

736 * 2B = 1472B.

Ini membuat saya mencapai 20 karena tag versi 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

Contoh lain. Jika Anda beralih ke 50 dari 49, Anda mendapatkan VARCHAR (MAX) ke 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

Tampaknya masalah ini tetap ada, bahkan di SQL Server 2012. @SQLKiwi menunjuk ke pos ini oleh Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .


Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Paul White 9

Jawaban:


8

Di mana halaman digunakan untuk keperluan internal seperti sort running, ukuran baris maksimum adalah 8.094 byte . Untuk halaman data, ukuran maksimum dalam baris termasuk overhead baris internal adalah 8060 byte .

Overhead baris internal dapat meluas secara signifikan jika fitur engine tertentu sedang digunakan. Misalnya, menggunakan kolom jarang mengurangi ukuran data yang dapat diakses pengguna menjadi 8019 byte.

Satu-satunya contoh overhead baris eksternal yang saya ketahui hingga SQL Server 2012 adalah 14 byte yang diperlukan untuk baris berversi . Overhead eksternal ini membawa penggunaan ruang maksimum untuk satu baris menjadi 8074 byte, ditambah 2 byte untuk entri array slot tunggal, menjadikan total 8076 byte. Ini masih 20 byte pendek dari batas 8096 (8192 ukuran halaman - 96 byte header tetap).

The penjelasan yang paling mungkin adalah bahwa asli batas 8060 byte tersisa 34 byte untuk ekspansi masa depan, yang 14 digunakan untuk pelaksanaan baris-versioning.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.