W Microsoft SQL Server dane (w tym indeksy) są przechowywane na jednej lub więcej 8k (8192 bajtów) „stronach”. Istnieją różne typy stron, które można wykorzystać do obsługi różnych sytuacji (np. Dane, LOB, Indeks, Mapa alokacji itp.). Każda strona ma nagłówek, który zawiera metadane dotyczące tej strony i jej zawartości.
Większość danych jest przechowywana w samym wierszu, a jeden lub więcej z tych wierszy jest z kolei przechowywanych na stronie dla „danych w wierszu”. Ze względu na miejsce zajmowane przez nagłówek wiersza, największy wiersz, który może być (dla danych „w wierszu”), wynosi 8060 bajtów.
Jednak nie wszystkie dane są przechowywane w wierszu. W przypadku niektórych typów danych dane mogą być faktycznie przechowywane na stronie „Dane LOB”, podczas gdy wskaźnik pozostaje w danych „w wierszu”:
-
Starsze / przestarzałe typy LOB, których nikt nie powinien już używać (
TEXT
,NTEXT
iIMAGE
), domyślnie zawsze przechowują swoje dane na stronach LOB i zawsze używaj 16-bajtowego wskaźnika do tej strony LOB. -
Nowsze typy LOB (
VARCHAR(MAX)
,NVARCHAR(MAX)
,VARBINARY(MAX)
iXML
), domyślnie spróbuje dopasować dane bezpośrednio do wiersza, jeśli będzie pasować. W przeciwnym razie będzie przechowywać dane na stronach LOB i używać wskaźnika o długości 24 - 72 bajtów (w zależności od rozmiaru danych LOB).
W ten sposób możesz przechowywać do 78 GB + 4 bajty (nie zapomnij o INT
Klucz podstawowy;-) w jednym wierszu:maksymalny rozmiar wiersza będzie wynosić od 940 bajtów ((39 * 24) + 4) do 2812 bajtów ((39 * 72) + 4). Ale znowu, to tylko maksymalny zasięg; jeśli dane w każdym z 39 VARCHAR(MAX)
pola mają tylko 10 bajtów, wtedy wszystkie dane będą przechowywane w wierszu, a rozmiar wiersza wyniesie 394 bajty ((39 * 10) + 4).
Biorąc pod uwagę, że masz tak wiele pól o zmiennej długości (niezależnie od tego, czy mają wartość MAX, czy nie), jedynym sposobem oszacowania rozmiaru przyszłych wierszy jest dobre rozeznanie, jakie dane będą przechowywane w tej tabeli. Chociaż tabela ze wszystkimi, a nawet w większości typami danych MAX, sugeruje, że nikt tak naprawdę nie ma pojęcia, co będzie przechowywane w tej tabeli.
W związku z tym należy podkreślić, że jest to okropnie modelowana tabela / okropne użycie pól typu danych MAX i należy je zrefaktoryzować.
Aby uzyskać więcej informacji na temat struktury stron danych, zobacz moją odpowiedź na następujące pytanie dotyczące DBA.StackExchange:
SUMA DŁUGOŚCI DANYCH niezgodna z rozmiarem tabeli z sys.allocation_units