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

Как се стига до ограничения от 8060 байта на ред и 8000 на (varchar, nvarchar) стойност?

Вътре в системата за съхранение:Анатомия на запис

Това е за SQL Server 2005

  • заглавка на записа
    • 4 байта
    • два байта метаданни на записа (тип запис)
    • два байта, сочещи напред в записа към растерната карта NULL
  • част от записа с фиксирана дължина, съдържаща колоните, съхраняващи типове данни с фиксирана дължина (напр. bigint, char(10), datetime)
  • NULL растерна карта
    • два байта за броя на колоните в записа
    • променлив брой байтове за съхраняване на един бит на колона в записа, независимо дали колоната е нула или не (това е различно и по-просто от SQL Server 2000, който имаше само един бит на колона с нула)
    • това позволява оптимизиране при четене на колони, които са NULL
  • Масив с изместване на колони с променлива дължина
    • два байта за броя на колоните с променлива дължина
    • два байта на колона с променлива дължина, даващи отместване до края на маркера за версия на стойността на колоната
  • това е само в SQL Server 2005 и е 14-байтова структура, която съдържа времева марка плюс указател към хранилището на версиите в tempdb

И така, за един знак (8000)

  • 4 байта (заглавка на записа)
  • 8000 фиксирана дължина
  • 3 нулеви растерни изображения
  • 2 байта за броене на променлива дължина
  • 14 времеви печат

Въпреки това, ако сте имали 40 varchar(200) колони

  • 4 байта (заглавка на записа)
  • 0 фиксирана дължина
  • 6 нулеви растерни изображения
  • 2 байта за броене на променлива дължина
  • 202 x 40 =8080
  • 14 времеви печат

Общо =8080 + 4 + 6 + 2 + 14 =8106. WTF? Получавате предупреждение, когато създадете тази таблица

Не бих се зациклил много на това:тази информация е не практична ежедневна стойност



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на sp_help_schedule в SQL Server

  2. Dapper.NET и съхранена процедура с множество набори от резултати

  3. SQL WHERE клауза, съответстваща на стойности с крайни интервали

  4. CAST() срещу TRY_CAST() в SQL Server:Каква е разликата?

  5. Ограничение по подразбиране на SQL за вмъкване на колона със стойност по подразбиране в таблицата на SQL Server