У меня есть таблица, которая содержит очень основную информацию. Просто заголовок и несколько полей даты. Есть одно поле с именем comments, которое называется varchar (4000). В большинстве случаев мы оставляем это поле пустым, но иногда здесь вводится большое количество данных. Это действительно плохой дизайн? Или это просто немного неэффективно?
Я бы предположил, что создание отдельной таблицы для этого столбца будет лучше.
примечание: это SQL Server 2008
SPARSE
и не используяSPARSE
...Ответы:
Для более предсказуемой производительности (и во избежание большого разброса строк на странице) я бы предпочел хранить эти данные в связанной таблице, особенно если они заполнены небольшим процентом времени, особенно если они извлекаются только в некоторые из запросов. Строки, в которых это значение
NULL
, вносят вклад в пространство, но это минимально. Более важным будет то, как одна страница может уместиться только в две строки, а следующая страница может уместиться в 500 строк - это действительно может повлиять на статистику, и вам лучше разбить ее на части, чтобы она сохранялась отдельно и не влияла на все ваши операции на основной стол.источник
Занимает минимум места, когда не используется
Затраты минимальны, и оптимизация будет преждевременной.
Пока вы не знаете, что у вас есть проблема, просто держите ее в одном столе. Вы нарушаете KISS, вводя внешние объединения и добавляя накладные расходы при запросе данных.
См. Https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 для получения дополнительной информации.
источник
Я думаю, что отдельная таблица была бы лучше, чтобы улучшить плотность страниц и уменьшить фрагментацию, особенно если вы не всегда заполняете это поле.
Все эти пустые страницы и указатели ведут к снижению производительности. Нормализуйте это поле, если можете.
источник
Этот вопрос выглядит очень похоже: действительно ли лишние пустые столбцы влияют на размер таблицы SQL?
Похоже, ответ - да, он занимает место, но есть алгоритм сжатия для столбцов с большим количеством нулевых значений.
Что касается дизайна, я думаю, что привязка к нему внешней таблицы была бы более чистой конструкцией. Наличие столбца с частыми нулевыми значениями усложняет работу пользователей базы данных, поскольку они могут случайно использовать нулевое значение, если не будут осторожны. Следовательно, код, использующий базу данных, должен содержать проверку ошибок, и от этого он становится просто уродливым.
источник
SPARSE
, а не только к «столбцам с большим количеством нулевых значений».Вы будете в порядке - это уже столбец varchar, поэтому он использует пространство только тогда, когда он содержит данные. Если у вас есть много столбцов фиксированного размера, например int, которые могут содержать значения NULL, у вас могут возникнуть проблемы с использованием пространства.
Что касается помещения в другой стол, я бы не стал беспокоиться. Вы также можете посмотреть на использование параметров varchar (max) и in / out of row. Опять наверное преждевременно.
источник