#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 МБ. Очевидно, что для этого есть веская причина, но не похоже, что цель увеличения объема базы данных не достигается. Это просто начальные накладные расходы?