Имеет ли значение размер 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


2
Предполагая, что SQL Server похож? Я бы не стал ...
АК

Извините, я понимаю, что мой ответ неполон. Я имею в виду, что я бы допустил ошибку на стороне предостережения (то есть не внесения изменений, которые могли бы негативно повлиять на производительность), если это предположение не будет установлено как ошибочное.
Мэтт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.