SQL Server: создание столбцов таблицы для наиболее эффективного размера

#sql-server #database-design

#sql-сервер #проектирование базы данных

Вопрос:

Моя база данных SQL Server была создана и спроектирована независимым разработчиком.

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

Большинство столбцов были созданы как

 VARCHAR (255), NULL
  

Это относится к тем, где они находятся

  • Числовые символы длиной не более 2 чисел
  • Числовые символы, длина которых никогда не будет превышать 3 цифр или пустых
  • Альфа, которая будет содержать только 1 букву или будет пустой

Затем имеется ряд столбцов, которые являются буквенно-цифровыми и содержат не более 10 буквенно-цифровых символов и не более 25.

Существует один большой буквенно-цифровой столбец, который может содержать до 300 символов.

Внесена поправка в столбец, который показывает время, затраченное в секундах на запуск события. Менее 1000 секунд и до 2 знаков после запятой

Это значение задается как DECIMAL (18,2) NULL

Вопрос в том, могу ли я уменьшить размер базы данных, изменив типы данных столбцов, или первоначальный дизайн был оптимальным для этой цели?

Комментарии:

1. Выберите тип данных, наиболее подходящий для области данных, и хранилище обычно будет наиболее оптимальным. Кажется, что десятичное число (6,2) является правильным выбором для затраченного времени, что сэкономит 4 байта по сравнению с десятичным числом (18,2).

2. Хорошо, Дэн, это имеет смысл для этого столбца. Он был изменен по сравнению с исходным VARCHAR(255), поскольку он создавал трудности при использовании данных в этом формате. Большое спасибо за комментарий ….Крис

3. Да, я должен был упомянуть, что правильные типы данных также облегчают удобство использования данных, такие как операторы сравнения без преобразования типов.

Ответ №1:

Вы определенно должны стремиться использовать наиболее подходящие типы данных для всех столбцов — и в этом отношении этот независимый разработчик проделал очень плохую работу — как с точки зрения согласованности, так и с точки удобства использования (просто попробуйте суммировать числа в VARCHAR(255) столбце или отсортировать по их числовому значению — ужасно плохой дизайн …), но также и с точки зрения производительности.

  • Числовые символы длиной не более 2 чисел
  • Числовые символы, длина которых никогда не будет превышать 3 цифр или пустых

-> если вам не нужны дробные десятичные точки (только целые числа) — используйте INT

  • Альфа, которая будет содержать только 1 букву или будет пустой

-> в этом случае я бы использовал CHAR(1) (или NCHAR(1) , если вам нужно иметь возможность обрабатывать символы Юникода, такие как иврит, арабский, кириллица или восточноазиатские языки). Поскольку на самом деле это всего лишь 1 символ (или ничего), нет необходимости или смысла использовать строковый тип данных переменной длины, поскольку это добавляет только по крайней мере 2 байта накладных расходов на сохраненную строку

  • Существует один большой буквенно-цифровой столбец, который может содержать до 300 символов.

-> Это отличный кандидат для VARCHAR(300) столбца (или еще раз: NVARCHAR(300) если вам нужно поддерживать Unicode). Здесь я бы определенно использовал строковый тип переменной длины, чтобы избежать заполнения столбца пробелами до заданной длины, если вы действительно хотите хранить меньше символов.

Комментарии:

1. Ответ на этот вопрос такой, как я и предполагал, и я благодарен, что теперь это ясно. Я протестирую изменения в некоторых столбцах и, надеюсь, при сжатии базы данных размер уменьшится. Крис ….

2. @no9chris — из любопытства, насколько велика ваша база данных, как с точки зрения размера диска, так и количества строк в этих таблицах? Переключение на соответствующие типы данных — это, безусловно, правильный путь (даже если проблема не связана с дисковым пространством), но я не знаю, какую экономию дискового пространства вы увидите, переключаясь с varchar(255) на int , если у вас нет больших объемов данных.

3. Я выполнил изменения столбцов в копии основной базы данных, размер которой составлял всего 127 МБ (5% от текущей). Затем запустив СЖАТИЕ для этой базы данных, я был удивлен, увидев, что она УВЕЛИЧИЛАСЬ до 157 МБ. Странно, поэтому я снова преобразовал 12 столбцов обратно в VARCHAR. Произвел сжатие, и на этот раз общий размер составил 178 МБ. Очевидно, что для этого есть веская причина, но не похоже, что цель увеличения объема базы данных не достигается. Это просто начальные накладные расходы?