Как получить ограничение в 8060 байт на строку и 8000 на значение (varchar, nvarchar)? - PullRequest
3 голосов
/ 25 сентября 2010

Исходя из моего вопроса " 8078 байт в странице данных 8060 B (SQL Server)? ", где мне было объяснено, как получить 8078 байт данных на страницу в MS SQL Server.

Если я вычислю количество байтов на страницу, используемое для хранения данных (без издержек), только одной строки с одним столбцом неиндексированной записи фиксированного размера (согласно статье MSDN ОценкаРазмер кучи ), затем я получаю 8087 байт (на страницу).

Как мне добраться до пределов 8060 байт на строку (упомянутых в ответах на другие мои вопросы) и до 8000байт в (varchar, nvarchar), не покупая и не изучая более 1000 книг страниц?

Я определенно что-то упускаю при распределении памяти: чем меньше кусков для управления, тем больше накладных расходов ...

Ответы [ 2 ]

6 голосов
/ 25 сентября 2010

Внутри механизма хранения: анатомия записи

Это для 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 х 40 = 8080
  • 14 отметка времени

Всего = 8080 + 4 + 6 + 2 + 14 = 8106. WTF? При создании этой таблицы вы получаете предупреждение

Я бы не стал слишком зацикливаться на этом: эта информация имеет нет практических повседневных значений

1 голос
/ 25 сентября 2010

Я не совсем уверен, что вы спрашиваете, но если ваш вопрос «почему максимальная длина строки 8060 байт, а не какое-то другое число?», Или «почему NVARCHAR имеет максимальную длину 8000 байт? " тогда короткий ответ: кто знает? (И, как сказал Гбн, кого это волнует?)

Все ограничения MSSQL - размеры типов данных, максимальный размер строки, столбцы в таблице, столбцы в индексе и т. Д. - являются только проектными решениями Microsoft. Я совершенно уверен, что за решениями стоит огромное количество технической документации, но большинство людей не имеют доступа к этой информации.

Если вас интересуют конкретные сведения о том, что такое ограничения, как рассчитывается размер строки и т. Д., Лучше всего начать с чтения документации по MSSQL.

...