В Microsoft SQL Server данните (които включват индекси) се съхраняват в една или повече 8k (8192 байта) „страници“. Има различни типове страници, които могат да се използват за обработка на различни ситуации (напр. данни, LOB, индекс, карта на разпределението и т.н.). Всяка страница има заглавка, която представлява метаданни за тази страница и какво съдържа.
Повечето данни се съхраняват в самия ред и един или повече от тези редове на свой ред се съхраняват в страница за „данни в ред“. Поради пространството, заето от заглавката на реда, най-големият ред, който може да бъде (за данни „в ред“) е 8060 байта.
Не всички данни обаче се съхраняват в реда. За определени типове данни данните могат действително да се съхраняват на страница „LOB данни“, докато в данните „в ред“ остава указател:
-
Наследени/отхвърлени LOB типове, които никой вече не трябва да използва (
TEXT
,NTEXT
иIMAGE
), по подразбиране винаги съхраняват своите данни на LOB страници и винаги използват 16-байтов указател към тази LOB страница. -
По-новите типове LOB (
VARCHAR(MAX)
,NVARCHAR(MAX)
,VARBINARY(MAX)
иXML
), по подразбиране ще се опита да побере данните директно в реда, ако може да се побере. В противен случай ще съхранява данните на LOB страници и ще използва указател от 24 - 72 байта (в зависимост от размера на LOB данните).
Ето как можете да съхранявате до 78 GB + 4 байта (не можете да забравите за INT
Първичен ключ;-) в един ред:максималният размер на реда ще бъде между 940 байта ((39 * 24) + 4) и 2812 байта ((39 * 72) + 4). Но отново, това е само максималният обхват; ако данните във всеки от 39 VARCHAR(MAX)
полетата е само 10 байта, тогава всички данни ще се съхраняват в ред и размерът на реда ще бъде 394 байта ((39 * 10) + 4).
Като се има предвид, че имате толкова много полета с променлива дължина (независимо дали са MAX или не), единственият начин да оцените размера на бъдещите редове е да имате добра представа какви данни ще съхранявате в тази таблица. Въпреки това, таблица с всички или дори повечето типове данни MAX предполага, че никой няма представа какво ще се съхранява в тази таблица.
В този смисъл трябва да се отбележи, че това е ужасно моделирана таблица/ужасно използване на MAX полета за тип данни и трябва да бъде преработено.
За повече подробности относно това как са структурирани страниците с данни, моля, вижте моя отговор на следния въпрос на DBA.StackExchange:
SUM от DATALENGTH не съответства на размера на таблицата от sys.allocation_units