Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Максимален размер на реда на SQL Server спрямо Varchar (максимален) размер

В 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Групирайте близки числа

  2. Как мога да ускоря тази Sql Server Spatial заявка?

  3. Изберете последните 30 дни с sql заявка

  4. Закръгляване надолу DECIMAL(14,3) до третата десетична цифра в SQL 2008

  5. Изпълнение на SSIS пакет като задание на SQLAgent