В чем разница между Char и Varchar?
• Хотя char и varchar являются полями символьных данных, char — это поле данных фиксированной длины, а varchar — поле данных переменного размера.
• Char может хранить только строковые символы фиксированного размера, отличные от Unicode, но varchar может хранить строки переменных размеров.
• Char лучше, чем varchar, для данных, которые часто меняются. Это связано с тем, что строка данных фиксированной длины не подвержена фрагментации.
• Char будет занимать только фиксированное пространство, определенное при объявлении переменной. Но varchar будет занимать пространство в зависимости от вставленных данных, а также будет занимать 1 или 2 байта в качестве префикса длины.
• Если данные меньше 255 символов, выделяется 1 байт, а если данные больше 255 символов, зарезервированы 2 байта. Если мы используем char для хранения флага «Y» и «N», он будет использовать один байт для хранения, но когда мы используем varchar, для хранения флага потребуется два байта, включая дополнительный байт в качестве префикса длины.
Резюме:
Сравнение хранения LOB в строке (In-Row) и вне строки (Out-of-Row)
CREATE TABLE demo.OneColVarcharMaxIn (Col1 VARCHAR(MAX)); CREATE TABLE demo.OneColVarcharMaxOut (Col1 VARCHAR(MAX));
EXEC sp_tableoption 'demo.OneColVarcharMaxOut', 'large value types out of row', 1;
1 символ
TableName | AllocUnitTp | PgCt | AvgPgSpcUsed | RcdCt | MinRcdSz | MaxRcdSz | FwdRcdCt |
---|---|---|---|---|---|---|---|
OneColVarcharMaxIn | IN_ROW_DATA | 1 | 0.15 | 1 | 12 | 12 | |
OneColVarcharMaxOut | IN_ROW_DATA | 1 | 0.33 | 1 | 27 | 27 | |
OneColVarcharMaxOut | LOB_DATA | 1 | 1.04 | 1 | 84 | 84 | NULL |
8000 символов
TableName | AllocUnitTp | PgCt | AvgPgSpcUsed | RcdCt | MinRcdSz | MaxRcdSz | FwdRcdCt |
---|---|---|---|---|---|---|---|
OneColVarcharMaxIn | IN_ROW_DATA | 1 | 98.97 | 1 | 8011 | 8011 | |
OneColVarcharMaxOut | IN_ROW_DATA | 1 | 0.33 | 1 | 27 | 27 | |
OneColVarcharMaxOut | LOB_DATA | 2 | 50.02 | 2 | 84 | 8014 | NULL |
8001 символов
TableName | AllocUnitTp | PgCt | AvgPgSpcUsed | RcdCt | MinRcdSz | MaxRcdSz | FwdRcdCt |
---|---|---|---|---|---|---|---|
OneColVarcharMaxIn | IN_ROW_DATA | 1 | 0.43 | 1 | 35 | 35 | |
OneColVarcharMaxIn | LOB_DATA | 1 | 99.02 | 126 | 8015 | 8015 | NULL |
OneColVarcharMaxOut | IN_ROW_DATA | 1 | 0.33 | 1 | 27 | 27 | |
OneColVarcharMaxOut | LOB_DATA | 2 | 98.43 | 127 | 84 | 8015 | NULL |
1000000 символов
TableName | AllocUnitTp | PgCt | AvgPgSpcUsed | RcdCt | MinRcdSz | MaxRcdSz | FwdRcdCt |
---|---|---|---|---|---|---|---|
OneColVarcharMaxIn | IN_ROW_DATA | 1 | 0.43 | 1 | 35 | 35 | |
OneColVarcharMaxIn | LOB_DATA | 126 | 98.42 | 126 | 2020 | 8054 | NULL |
OneColVarcharMaxOut | IN_ROW_DATA | 1 | 0.33 | 1 | 27 | 27 | |
OneColVarcharMaxOut | LOB_DATA | 126 | 98.43 | 127 | 84 | 8054 | NULL |
Что такое Чар?
По определению ISO символа char персонаж и тип данных char привык кхранить персонажа. Char (n) может хранить n символов фиксированного размера. Максимальное количество символов, которое может содержать char (n), составляет 255 символов, а длина строки должна иметь значение от 1 до 8000. Char на пятьдесят процентов быстрее, чем varchar, и, следовательно, мы можем получить лучшую производительность, работая с char. Char использует статическое распределение памяти при хранении данных. Когда мы хотим хранить строки с известной фиксированной длиной, лучше использовать char. Например, при сохранении «Да» и «Нет» как «Y» и «N» мы можем использовать тип данных char. А также при сохранении номера национального удостоверения личности, состоящего из десяти символов, мы можем использовать тип данных как char (10).
Выводы
- Где это подходит, используете VARCHAR(n), а не VARCHAR(MAX)
- даже если нет прироста производительности, в целях хорошего проектирования и
- поскольку данные VARCHAR(MAX) не сжимаются.
- Сохранение больших строк занимает больше времени, чем небольших.
- Обновление значения VARCHAR(MAX) (in row) от значения ниже 8000 к значению свыше 8000 будет относительно медленным, хотя разница для отдельной транзакции не будет заметной.
- Обновление in-row значения VARCHAR(MAX) от значения свыше 8000 к значению ниже 8000 будет быстрей, чем если бы таблица была установлена на сохранение данных out-of-row.
- Использование опции out-of-row для VARCHAR(MAX) будет замедлять запись, пока строки не очень длинны.