Я читал об этом на форумах MSDN и здесь, и мне все еще не ясно. Я думаю, что это правильно: Varchar (max) будет храниться как текстовый тип данных, поэтому у него есть недостатки. Допустим, ваше поле будет надежно содержать менее 8000 символов. Как поле BusinessName в моей таблице базы данных. На самом деле название компании, вероятно, всегда будет состоять из (вытаскивая из моей шляпы число) менее 500 символов. Похоже, что множество полей varchar, с которыми я сталкиваюсь, хорошо укладываются в число символов 8k.
Так следует ли мне сделать это поле varchar (500) вместо varchar (8000)? Насколько я понимаю, между ними нет разницы. Итак, чтобы упростить жизнь, я бы хотел определить все свои поля varchar как varchar (8000). Есть ли у этого недостатки?
Связано: Размер столбцов varchar (мне не казалось, что это ответило на мой вопрос).
источник
Ответы:
С точки зрения обработки не будет иметь значения использование varchar (8000) vs varchar (500). Это больше похоже на «хорошую практику» - определить максимальную длину, которую должно содержать поле, и сделать ваш varchar такой длиной. Это то, что можно использовать для проверки данных. Например, сокращение штата должно состоять из 2 символов, а почтовый индекс - из 5 или 9 символов. Раньше это было более важным различием, когда ваши данные взаимодействовали с другими системами или пользовательскими интерфейсами, где длина поля была критичной (например, набор данных плоского файла мэйнфрейма), но в настоящее время я думаю, что это больше привычка, чем что-либо еще.
источник
Один из примеров, когда это может иметь значение, заключается в том, что это может предотвратить оптимизацию производительности, которая позволяет избежать добавления информации о версиях строк в таблицы с триггерами после.
Это описано в SQL Kiwi здесь
Точно так же при использовании таблиц, оптимизированных для памяти, с 2016 года стало возможным использовать столбцы больших объектов или комбинации ширины столбцов, которые потенциально могут превышать лимит встраивания, но со штрафом.
Это может иметь большое негативное влияние на потребление памяти и производительность.
Другой случай, когда чрезмерное объявление ширины столбца может иметь большое значение, - это то, будет ли таблица когда-либо обрабатываться с использованием SSIS. Память, выделенная для столбцов переменной длины (не BLOB), фиксируется для каждой строки в дереве выполнения и соответствует объявленной максимальной длине столбцов, что может привести к неэффективному использованию буферов памяти (пример) . Хотя разработчик пакета SSIS может объявить столбец меньшего размера, чем исходный, этот анализ лучше всего проводить заранее и применять там.
В самом ядре SQL Server похожий случай заключается в том, что при вычислении объема памяти, выделяемой для
SORT
операций, SQL Server предполагает, чтоvarchar(x)
столбцы в среднем потребляютx/2
байты.Если большинство ваших
varchar
столбцов заполнено больше, чем это, это может привести к тому, чтоsort
операции будут перенаправлены наtempdb
.В вашем случае, если ваши
varchar
столбцы объявлены как8000
байты, но на самом деле имеют содержимое намного меньше, чем это, вашему запросу будет выделена память, которая ему не требуется, что явно неэффективно и может привести к ожиданию предоставления памяти.Это рассматривается во второй части веб-трансляции 1 семинаров по SQL, которую можно загрузить отсюда или посмотреть ниже.
use tempdb; CREATE TABLE T( id INT IDENTITY(1,1) PRIMARY KEY, number int, name8000 VARCHAR(8000), name500 VARCHAR(500)) INSERT INTO T (number,name8000,name500) SELECT number, name, name /*<--Same contents in both cols*/ FROM master..spt_values SELECT id,name500 FROM T ORDER BY number
SELECT id,name8000 FROM T ORDER BY number
источник
char(4)
как в любом случае накладные расходы составляют 2 байта на столбец переменной.Помимо лучших практик (ответ BBlake)
источник
nvarchar
иvarchar
типов, это только означает , что конечные пробелы сохранены при вставке - не то, что эти значения дополняются пробелами до размера колонки, как вchar
иnchar
.У больших столбцов есть некоторые недостатки, которые менее очевидны и могут вас уловить немного позже:
Как правило, старайтесь подходить к ширине столбца консервативно. Если это станет проблемой, вы можете легко расширить ее в соответствии с потребностями. Если вы заметите проблемы с памятью позже, сжатие широкого столбца позже может стать невозможным без потери данных, и вы не будете знать, с чего начать.
В вашем примере с названиями компаний подумайте, где вы можете их отображать. Есть ли место для 500 символов ?? В противном случае нет смысла хранить их как таковые. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States перечисляет названия некоторых компаний, максимальная длина составляет около 50 символов. Поэтому я бы использовал 100 для столбца max. Может, больше 80.
источник
В идеале вы должны пойти меньше, чем это, до разумной длины (500 - не разумный размер) и убедиться, что проверка клиента улавливает, когда данные будут слишком большими, и отправляет полезную ошибку.
Хотя varchar на самом деле не собирается резервировать место в базе данных для неиспользуемого пространства, я вспоминаю версии SQL Server, в которых говорилось о том, что строки базы данных шире некоторого числа байтов (не помню точное количество) и фактически выбрасывали какие данные не подходят. Определенное количество этих байтов было зарезервировано для внутренних операций SQL Server.
источник