Подтвердить что ты не робот

Как хранятся значения varchar в базе данных SQL Server?

У моего коллеги-программиста есть странное требование от его руководителя команды; он настаивал на создании столбцов varchar с длиной 16 * 2 n.

В чем смысл такого ограничения?

Я могу предположить, что короткие строки (например, менее 128 символов) хранятся непосредственно в записи таблицы, и с этой точки зрения ограничение поможет выровнять поля в записи, более крупные строки хранятся в базе данных "куча", и только запись в эту строку сохраняется в записи таблицы.

Это так?

Это требование имеет разумный фон?

BTW, СУБД - это SQL Server 2008.

4b9b3361

Ответ 1

Полностью бессмысленное ограничение, насколько я вижу. Предполагая стандартный формат FixedVar (в отличие от форматов, используемых с сжатием строк или страниц или разреженных столбцов) и предполагая, что вы говорите о столбцах varchar(1-8000)

Все данные varchar хранятся в конце строки в разделе переменной длины (или в перелистывании страниц, если они не могут вписываться в строку). Объем пространства, который он потребляет в этом разделе (и независимо от того, заканчивается ли он), полностью зависит от длины фактических данных, а не от объявления столбца.

SQL Server будет использовать длину, объявленную в объявлении столбца при распределении памяти (например, для операций sort). Предположение, которое он делает в этом случае, состоит в том, что столбцы varchar будут заполнены до 50% от их объявленного размера в среднем, так что это может быть лучше, если посмотреть, когда выбирая размер.

Ответ 2

Вы всегда должны хранить данные в размере данных, которые соответствуют хранящимся данным. Это часть того, как база данных может поддерживать целостность. Например, предположим, что вы храните адреса электронной почты. Если ваш размер данных является размером максимально допустимого адреса электронной почты, то вы не сможете хранить плохие данные, которые больше этого. Это хорошая вещь. Некоторые люди хотят сделать все nvarchar (max) или varchar (max). Однако это вызывает только проблемы с индексацией.

Лично я бы вернулся к человеку, который выполнил это требование, и попросил причину. Тогда я бы изложил свои причины, почему это может быть не очень хорошая идея. Я никогда не буду просто слепо реализовывать что-то подобное. Повторяя такое требование, я сначала сделаю некоторое исследование того, как SQL Server организует данные на диске, поэтому я мог бы показать, что влияние этого требования, скорее всего, будет иметь производительность. Я мог бы даже удивиться, узнав, что это имело смысл, но в данный момент я сомневаюсь.

Ответ 3

Я слышал об этой практике раньше, но, немного исследовав этот вопрос, я не думаю, что существует практическая причина для значений varchar в 16 раз. Я думаю, что это требование, вероятно, связано с попыткой оптимизировать используемое пространство на каждой странице. В SQL Server страницы устанавливаются на уровне 8 КБ на страницу. Строки хранятся на страницах, поэтому, возможно, мышление состоит в том, что вы можете сохранить пространство на страницах, если размер каждой строки равномерно распределяется на 8 КБ (более подробное описание того, как SQL Server хранит данные, можно найти здесь). Однако, поскольку объем пространства, используемого полем varchar, определяется его фактическим содержимым, я не вижу, как использование длин в кратных 16 или любой другой схеме может помочь вам оптимизировать объем пространства, используемый каждой строкой на странице, Длина полей varchar должна быть установлена ​​только в соответствии с требованиями бизнеса.

Кроме того, этот вопрос охватывает аналогичные основания, и вывод также кажется таким же:
Размеры столбцов базы данных для данных на основе символов