Так как в varchar
любом случае динамически выделяется пространство, мой вопрос заключается в том, varchar(255)
будет ли использование более эффективным или сэкономит больше места по сравнению с использованием varchar(5000)
. Если да, то почему?
sql-server
Тинтин
источник
источник
Ответы:
Да,
varchar(5000)
может быть хуже, чемvarchar(255)
если бы все значения вписывались в последние. Причина в том, что SQL Server будет оценивать размер данных и, в свою очередь, предоставление памяти на основе объявленного (не фактического ) размера столбцов в таблице. Если у вас естьvarchar(5000)
, он будет предполагать, что каждое значение имеет длину 2500 символов, и резервировать память на основе этого.Вот демонстрация из моей недавней презентации GroupBy о вредных привычках, которая позволяет легко доказать это для себя (требуется SQL Server 2016 для некоторых
sys.dm_exec_query_stats
выходных столбцов, но он все же должен быть подтвержден с помощьюSET STATISTICS TIME ON
других инструментов в более ранних версиях); он показывает больший объем памяти и более длительное время выполнения для одного и того же запроса к тем же данным - единственное отличие заключается в объявленном размере столбцов:Так что, да , пожалуйста, измените размер столбцов .
Кроме того, я перезапустил тесты с varchar (32), varchar (255), varchar (5000), varchar (8000) и varchar (max). Аналогичные результаты ( нажмите, чтобы увеличить ), хотя различия между 32 и 255 и между 5000 и 8000, были незначительными:
Вот еще один тест с
TOP (5000)
изменением более полностью воспроизводимого теста, о котором меня постоянно преследовали ( нажмите, чтобы увеличить ):Таким образом, даже с 5000 строк вместо 10000 строк (и в sys.all_columns более 5000 строк, по крайней мере, так же далеко, как в SQL Server 2008 R2), наблюдается относительно линейная прогрессия - даже с теми же данными, чем больше определенный размер столбца, тем больше памяти и времени требуется для выполнения точно такого же запроса (даже если он имеет бессмысленный смысл
DISTINCT
).источник
varchar(450)
иvarchar(255)
быть одинаковой? (Или что-нибудь ниже 4000?)rowcount*(column_size/2)
.