varchar Fields — сила двух более эффективна?

Является ли более эффективным использование поля varchar размером в степени двойки по сравнению с другим числом? Я думаю, что нет, потому что для SQL Server значение по умолчанию равно 50.

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

Итак, имеет ли поле, объявленное как varchar(32) или varchar(64), какое-либо реальное преимущество перед varchar(50)?


person HardCode    schedule 27.02.2009    source источник


Ответы (5)


Нет

В некоторых других случаях использование структур со степенью двойки имеет некоторые преимущества, в основном потому, что вы можете разместить хорошее (степень двойки) их количество внутри другой структуры со степенью двойки. Но это не относится к размеру поля БД.

Единственная степень двойки, связанная с VARCHAR, касается точного типа varchar (или TEXT/BLOB в некоторых диалектах SQL): если он меньше 256, для указания длины может использоваться один байт. если он меньше 65536 (64 КБ), достаточно двух байтов, три байта работают до 16777216 (16 МБ), четыре байта идут до 4294967296 (4 ГБ).

Кроме того, можно утверждать, что VARCHAR(50) так же дорог, как и VARCHAR(255), поскольку для обоих потребуется n+1 байт памяти.

Конечно, это до того, как я подумал о Unicode...

person Javier    schedule 27.02.2009

Я всегда думал, что люди выбирают степень двойки для полей varchar, потому что мы гики, и это то, что мы делаем. По крайней мере, я всегда так делал.

person Paul Tomblin    schedule 27.02.2009
comment
Я согласен, но как бы вы отразили этот лимит символов в пользовательском интерфейсе? Видеть n/1000 (рядом с текстовым полем) может иметь больше смысла, чем видеть n/1024 для обычного пользователя. Пользователь может пойти Что с 24? - person akinuri; 01.06.2020
comment
@akinuri в настоящее время я использую Postgresql, где вообще нет причин ограничивать длину поля varchar - поля varchar (100) и varchar (1000000) занимают одинаковое количество места, если в нем всего 99 символов. - person Paul Tomblin; 01.06.2020

Для SQL вообще? Нет. Возможно, для конкретной реализации.

Что эффективнее определяется не спецификацией (SQL — это всего лишь спецификация), а тем, как это реализовано в конкретной СУБД.

person Juliano    schedule 27.02.2009
comment
Одним из возможных мест для этого может быть формат в памяти для строк... Длина 2 ^ n должна уменьшить потребность в смещениях выравнивания. Обычно небольшой эффект, я подозреваю. - person dmckee --- ex-moderator kitten; 27.02.2009
comment
Выравнивание памяти происходит кратно, а не по степеням. Например, в архитектуре с 32-битным выравниванием наилучшее смещение байтов равно 4×n. - person Juliano; 27.02.2009

Единственное ощутимое преимущество, которое вы увидите при использовании определенных максимальных длин, — это место для хранения, необходимое для VARCHAR. Максимальная длина более 255 потребует дополнительного байта для хранения длины значения в каждой строке (и дополнительных 2 байта для длины 256 ^ 2 или больше и т. д.).

person Alex Barrett    schedule 27.02.2009
comment
разве это не 256*2? - person Realn0whereman; 26.04.2018
comment
@ Realn0whereman Нет, для 256 * 2 потребуется только дополнительный бит. 8 бит могут хранить значения от 0 до 255 (здесь предполагаются беззнаковые значения), дополнительный бит удваивает это значение до 0-511. Дополнительный байт (8 бит) приводит к 2^16 возможным значениям, или 0-65535, т.е. все, что ниже 256 ^ 2. - person Tom Galvin; 28.02.2019

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

person Adam Davis    schedule 27.02.2009