Один из примеров, когда это может иметь значение, заключается в том, что это может предотвратить оптимизацию производительности, которая позволяет избежать добавления информации о версиях строк в таблицы с триггерами после.
Это описано в SQL Kiwi здесь
Фактический размер хранимых данных не имеет значения - имеет значение потенциальный размер.
Точно так же при использовании таблиц, оптимизированных для памяти, с 2016 года стало возможным использовать столбцы больших объектов или комбинации ширины столбцов, которые потенциально могут превышать лимит встраивания, но со штрафом.
(Макс.) Столбцы всегда хранятся вне строк. Для других столбцов, если размер строки данных в определении таблицы может превышать 8060 байт, SQL Server выталкивает самые большие столбцы переменной длины за пределы строки. Опять же, это не зависит от количества данных, которые вы там храните.
Это может иметь большое негативное влияние на потребление памяти и производительность.
Другой случай, когда чрезмерное объявление ширины столбца может иметь большое значение, - это то, будет ли таблица когда-либо обрабатываться с использованием 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
FROM master..spt_values
SELECT id,name500
FROM T
ORDER BY number
SELECT id,name8000
FROM T
ORDER BY number