Бортовой журнал Ктулху

MSSQL best practices || Практические рекомендации по выбору типов полей

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

Ололоша 

Это Ололоша, и сегодня он решил создать таблицу в MS SQL и столкнулся с некоторыми трудностями. 

Сегодня он создал таблицу с учениками своего класса, Primary Key типа Tinyint и поле с именем типа text. Что ж, поздравим такого умного мальчика, но ему нужно внести пару небольших изменений.

Типы данных для хранения текста

`text`

Устаревший тип данных и используется только для обратной совместимости. Ни в коем случае не стоит его использовать в новых таблицах. Вместо него стоит использовать varchar(max)

 

`char(n)`

Тип данных с фиксированной длиной. Требует внимательности в обращении, поскольку, он занимает в любом слуае все выделенное ему место. Если в поле размером 10 символов записать 1 символ, то занято будет все равно 10 а все остальное будет дополнено пробелами.

Удобно, например, хранить какие-нибудь статусы типа "n", ну, или любые другие данные фиксированной длины.

 

`varchar(n)`, `nvarchar(n)`, `varchar(max)`, `nvarchar(max)`

Тип данных с переменной длиной текстовой строки. В отличие от типа поля char, данные в поле типа varchar не заполняются пробелами до общей длины поля, если фактическая длина строки меньше.

varchar - хранение латинских букв и букв выбранной кодовой страницы при настройке сервера базы данных или создании базы данных. То есть, на какой язык настроена БД, символы этого языка будут занимать 1 байт и английские символы аналогично. Максимальная длина - 8000 символов.

Длина max указывается, если поле должно хранить длинные тексты до 2 гигабайт. Тип поля varchar(max) следует использовать в качестве альтернативы устаревшему типу text.

nvarchar - хранение данных на других языках. На каждый символ тратится 2 байта данных. Максимальная длина - 4000 символов. Также для длинных текстов может использоваться тип поля nvarchar(max). Например, если захотите хранить что-то на иврите ну или клингонском.

 

Целочисленные типы

Bigint

Это тип данных в различных системах управления базами данных (СУБД), который используется для хранения целых чисел большого диапазона. Он обычно представляет собой целые числа от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 в двоичной системе.

Вот некоторые особенности BIGINT:

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

Использование памяти: Этот тип данных занимает больше памяти по сравнению с типами данных, хранящими меньший диапазон значений, например, INT. Это следует учитывать при проектировании схемы базы данных.

 

Int

это сокращение от "integer" (целое число) и является одним из наиболее распространенных типов данных для хранения целых чисел во многих языках программирования и системах управления базами данных (СУБД).

Основные особенности типа данных int:

Диапазон значений: int обычно занимает 32 бита (4 байта) памяти и может хранить целые числа от -2,147,483,648 до 2,147,483,647 включительно (в двоичной системе).

Зависимость от платформы: Размер int может варьироваться в зависимости от платформы и используемой системы. Например, в некоторых платформах int может быть 16-битным или 64-битным.

 

Smallint

Это тип данных, используемый во многих системах управления базами данных (СУБД), предназначенный для хранения целых чисел с небольшим диапазоном значений.

Основные характеристики smallint:

Диапазон значений: smallint обычно занимает 16 бит (2 байта) памяти и может хранить целые числа от -32,768 до 32,767 включительно (в двоичной системе).

Использование в СУБД: smallint часто используется для экономии памяти, когда требуется хранение целых чисел, но ожидается, что значения будут оставаться в относительно небольшом диапазоне. Это уменьшает использование памяти в сравнении с типами данных, такими как int или bigint.

Экономия ресурсов: Использование smallint может быть полезным, если вам необходимо хранить целые числа, но вы знаете, что значения не выйдут за пределы диапазона значений, поддерживаемого этим типом данных.

Ограничения и пределы: При использовании smallint важно учитывать его пределы и ограничения, чтобы избежать переполнения или ошибок в случае, если значения выйдут за пределы допустимого диапазона.

Тип данных smallint широко используется в базах данных для оптимизации использования памяти и хранения относительно небольших целых чисел. Он предоставляет компромисс между размером хранимых данных и ожидаемым диапазоном значений.

 

Tinyint

Это тип данных, используемый во многих системах управления базами данных (СУБД) для хранения целых чисел с очень небольшим диапазоном значений.

Основные характеристики tinyint:

Диапазон значений: tinyint обычно занимает 8 бит (1 байт) памяти и может хранить целые числа от 0 до 255 включительно (в двоичной системе). Если tinyint используется со знаком, то диапазон будет от -128 до 127.

Экономия памяти: Использование tinyint полезно, когда необходимо хранить целые числа с очень ограниченным диапазоном значений и при этом нужно экономить память.

Ограничения: Важно помнить, что из-за очень маленького диапазона значений tinyint может быть не подходящим для случаев, когда необходимо хранить большие целые числа.

Использование в СУБД: tinyint может использоваться для хранения данных, таких как флаги, статусы, или в случаях, когда необходимо хранить значения с ограниченным диапазоном.

 

Decimal, Numeric

Эти два типа данных полностью идентичны. Они предназначены для хранения чисел с фиксированной точкой и могут использоваться, например, для денежных данных.

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

Таким образом, поле с типом numeric(5,2) позволяет хранить числа в диапазоне от -999.99 до 999.99.

Следует ответственно выбирать точность для этих типов полей. Зависимость количества выделенных байт под хранение значений в зависимости от выбранной точности:

numeric(18, 0)

p = 18, s = 0

Если p = 18 ≤ 9, то размер = (18 / 2) + 1 = 10 байт

 

numeric(10, 2)

p = 10, s = 2

Если p = 10 ≤ 9, то размер = (10 / 2) + 1 = 6 байт

 

numeric(30, 5)

p = 30, s = 5

Если p = 30 > 9, то размер = (30 / 2) + 2 = 17 байт

 

Для хранения чисел без дробной части лучше использовать целочисленные типы.

 

Float, Real

Типы полей для хранения чисел с плавающей точкой.

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

 

Источник материала - статья одного хорошего и очень умного человека.