Один из примеров, где это может иметь значение, - это предотвращение оптимизации производительности, которая позволяет избежать добавления информации о версиях строк в таблицы с триггерами после.
Это покрыто SQL киви здесь
Фактический размер хранимых данных несущественен - это потенциал
размер, который имеет значение.
Аналогичным образом, при использовании таблиц, оптимизированных для памяти, с 2016 года стало возможным использовать столбцы больших объектов или комбинации ширины столбцов, которые потенциально могут превышать предел ввода, но со штрафом.
(Макс.) Столбцы всегда хранятся вне строки. Для других столбцов, если размер строки данных в определении таблицы может превышать 8 060 байт, SQL Server выталкивает самые большие столбцы переменной длины вне строки. Опять же, это не зависит от количества данных, которые вы там храните.
Это может оказать значительное негативное влияние на потребление памяти и производительность
Другой случай, когда чрезмерное объявление ширины столбцов может иметь большое значение, - это если таблица когда-нибудь будет обрабатываться с использованием служб SSIS. Память, выделенная для столбцов переменной длины (не BLOB), фиксирована для каждой строки в дереве выполнения и соответствует объявленной максимальной длине столбцов, что может привести к неэффективному использованию буферов памяти (пример) . Хотя разработчик пакета служб SSIS может объявить столбец меньшего размера, чем источник, этот анализ лучше всего выполнить заранее и применять его там.
В самом механизме SQL Server аналогичный случай заключается в том, что при расчете выделения памяти для SORT
операций SQL Server предполагает, что столбцы varchar(x)
будут в среднем занимать x/2
байтов.
Если большинство ваших столбцов varchar
заполнены больше, чем это, это может привести к тому, что операции sort
выльются в tempdb
.
В вашем случае, если ваши varchar
столбцы объявлены как 8000
байтов, но на самом деле их содержимое намного меньше, чем ваш запрос будет выделяться память, которая ему не требуется, что, очевидно, неэффективно и может привести к ожиданию памяти гранты.
Это описано в части 2 веб-трансляции по семинарам SQL 1 , которую можно загрузить здесь или см. Ниже.
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