Имеет ли значение размер varchar во временных таблицах?

16

В работе моей жены идет спор о том, чтобы просто использовать varchar(255)для всех varcharполей во временных таблицах хранимые процедуры. По сути, один лагерь хочет использовать 255, потому что он всегда будет работать, даже если определение изменится, а другой лагерь хочет придерживаться размера в исходных таблицах для потенциальных улучшений производительности.

Правильно ли устроен лагерь? Есть ли другие последствия? Они используют SQL Server.

Брайан Никель
источник
Я бы сказал, что, возможно, вам не нужны временные таблицы. Для чего они используются? Если они нужны, для чего используются эти конкретные столбцы? Они используются в соединениях или сравнениях любого рода? Являются ли какие-либо из нижележащих столбцов nvarchar, а не varchar?
Аарон Бертран
@AaronBertrand Временные таблицы предназначены для модульности. Данные преобразуются и заполняются несколько раз в зависимости от бизнес-правил, которые могут измениться. Я думаю, что есть также несколько MAX()в миксе.
Брайан Никель

Ответы:

6

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

Этот пример немного надуманный, но он иллюстрирует мою точку зрения. Пример:

  1. Ваш пользовательский столбец таблицы varchar (50).
  2. Ваш столбец временной таблицы varchar (255).
  3. У вас есть запись с 45 символами в этом столбце в вашей пользовательской таблице.
  4. В своей процедуре вы объединяете «- для выигрыша» до конца этого столбца, прежде чем объединить эту временную таблицу с вашей пользовательской таблицей.

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

Если вы не документируете и не учитываете эти проблемы, ваша процедура может работать неожиданно.

Лично я не думаю, что есть ответ на этот вопрос, который является правильным в 100% случаев. Это действительно зависит от того, как вы используете эти временные таблицы.

Надеюсь это поможет

Мэтт М
источник
0

использование varchar(255)для всех varcharполей во временных таблицах в хранимых процедурах.

Я бы склонялся к использованию фактической длины поля.

Недавно я прочитал, что временные таблицы MySQL (я предполагаю, что SQL Server аналогичен) выделяют достаточно памяти для хранения максимально возможной длины для каждого varcharстолбца ... Системный подход к выделению 200% -500% необходимой памяти для varcharполей во всех хранимые процедуры кажутся ненужным использованием системных ресурсов. Если вы когда-либо используете значительный объем памяти для создания этих временных таблиц, вы можете излишне требовать память, которая использовалась для кэширования, создавая дополнительную работу для сервера в некоторый момент в будущем, даже после выполнения процедур хранения.

Изменить: см. Ответ Билла Карвина: /programming/1962310/importance-of-varchar-length-in-mysql-table

Matt
источник
2
Предполагая, что SQL Server похож? Я бы не стал ...
АК
Извините, я понимаю, что мой ответ неполон. Я имею в виду, что я бы допустил ошибку на стороне предостережения (то есть не внесения изменений, которые могли бы негативно повлиять на производительность), если это предположение не будет установлено как ошибочное.
Мэтт