Jeśli spróbujesz utworzyć tabelę bez klastrowego ograniczenia PK, otrzymasz nieco inny błąd:
Msg 1701, poziom 16, stan 1, wiersz 1 Tworzenie lub modyfikowanie tabeli „Mytable” nie powiodło się, ponieważ minimalny rozmiar wiersza wynosiłby 8067, w tym 1530 bajtów narzutu wewnętrznego. Przekracza to maksymalny dopuszczalny rozmiar wiersza tabeli wynoszący 8060 bajtów.
W tym komunikacie o błędzie widać, że na kompresję strony przypada 1530 bajtów narzutu wewnętrznego.
Teraz możesz wykonać matematykę:
- 8 bajtów dla
bigint
MyTableID
- 4 bajty dla
int
LastColumn
- 9 bajtów dla każdej z 593
numeric(19,4)
kolumn (łącznie 5337 bajtów)
- 1530 bajtów narzutu kompresji
Więc 8 + 4 + (593 * 9) + 1530 = 6879.
Poczekaj sekundę ... To wciąż poniżej 8060. O co chodzi ?!
Algorytm kompresji strony faktycznie łączy kilka algorytmów kompresji. Pierwszym krokiem jest zastosowanie kompresji ROW. Narzut związany z kompresją wierszy nie jest uwzględniony w 1530 bajtach narzutu wymienionego w tym komunikacie o błędzie.
Możesz przeczytać więcej o tym, jak działa kompresja wierszy tutaj na moim blogu i tutaj w BOL . W artykule BOL zauważysz, że opisuje on numeric
pamięć jako „Ta pamięć jest dokładnie taka sama jak format pamięci vardecimal”, ale nie wyjaśnia vardecimal
. Ten post obejmuje vardecimal
nieco więcej - w zasadzie dodaje 2 bajty narzutu na kolumnę do przechowywania rzeczywistej długości (podobnie do tego, co varchar
robi).
Kompresja wierszy będzie wymagała dodatkowych 2 bajtów dla każdej z 593 numeric
kolumn oraz plus bigint
i int
będzie wymagać 1 bajta narzutu dla każdej.
Do wierszy sprężone wymagania przechowywania, to:
- 8 bajtów + 1 bajt narzut dla
bigint
MyTableID
- 4 bajty + 1 bajt narzut dla
int
LastColumn
- 9 bajtów + 2 bajty narzut dla każdej z 593
numeric(19,4)
kolumn
- 1188 bajtów narzutu kompresji ROW
8 + 4 + (593 * 9) = 5349 bajtów danych
1 + 1 + (593 * 2) = narzut kompresji rzędu 1188 bajtów
6537 bajtów łącznie dla schematu skompresowanego wierszem
Teraz, gdy mamy rozmiar wiersza dla schematu skompresowanego w wierszu, możemy wrócić do naszej matematyki. Rozmiar wiersza skompresowanego przez stronę to rozmiar danych + narzut kompresji wiersza + narzut kompresji strony:
- 8 bajtów dla
bigint
MyTableID
- 4 bajty dla
int
LastColumn
- 9 bajtów dla każdej z 593
numeric(19,4)
kolumn
- 1188 bajtów narzutu kompresji ROW
- 1530 bajtów narzutu kompresji PAGE
5349 bajtów danych
+ 1188 bajtów narzutu na kompresję wiersza
+ 1530 bajtów narzutu na kompresję strony
Łącznie 8067 bajtów