Tablica miejsc i całkowity rozmiar strony


13

Nadal czytam na wielu forach i na wielu blogach, że strona składa się, jak pokazano poniżej: Rozmiar strony: 16 x 512B = 8192B Nagłówek strony: = 96B Maksymalny wiersz w rzędzie: = 8060B

To pozostawia (8192 - 96 - 8060) B = 36B.

Ok, to jest logiczne i poprawne. Pytanie, które mam, brzmi: dlaczego tak wiele osób mówi, że pozostałe 36B jest zarezerwowane dla tablicy gniazd?

Oczywiście tablica szczelin daje 2B na wiersz na stronie; więc może być tak mały jak 2B i tak duży jak 1472B:

2B: 1 rząd * 2B = 2B

1472B: 8096B = n * 9B (minimalny rozmiar wiersza z narzutem ... pomyśl o pojedynczej kolumnie TINYINT) + n * 2B (koszt tablicy gniazd na wiersz) => 8096 = 11n => n = 8096/11 = 736.

736 * 2B = 1472 B.

To prowadzi mnie do 20 ze względu na tag wersji 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

Inny przykład. Jeśli przejdziesz do 50 z 49, otrzymasz VARCHAR (MAX) idący do 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

Wygląda na to, że problem ten występuje, nawet w SQL Server 2012. @SQLKiwi wskazuje na ten post autorstwa Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .


Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Paul White 9

Odpowiedzi:


8

Tam, gdzie strony są używane do celów wewnętrznych, takich jak sortowanie, maksymalny rozmiar wiersza wynosi 8094 bajtów . W przypadku stron danych maksymalny rozmiar wiersza, w tym narzut wewnętrzny wiersza, wynosi 8060 bajtów .

Zasięg wewnętrznego rzędu może się znacznie rozszerzyć, jeśli używane są pewne funkcje silnika. Na przykład użycie rzadkich kolumn zmniejsza dostępny dla użytkownika rozmiar danych do 8019 bajtów.

Jedynym przykładem narzutu zewnętrznego wiersza, który znam aż do SQL Server 2012, jest 14 bajtów wymaganych dla wersjonowanych wierszy . Ten narzut zewnętrzny zapewnia maksymalne wykorzystanie miejsca dla pojedynczego wiersza do 8074 bajtów oraz 2 bajty dla pojedynczego wpisu tablicy szczelin, co daje łączną liczbę 8076 bajtów. To wciąż 20 bajtów mniej niż limit 8096 (rozmiar strony 8192 - stały nagłówek 96 bajtów).

Najbardziej prawdopodobnym wyjaśnieniem jest to, że oryginalny limitu 8060 bajtów lewo 34 bajtów dla przyszłej ekspansji, z których 14 zostały wykorzystane do realizacji row-wersjami.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.