Чи має значення варчар у тимчасових таблицях?


16

На роботі моєї дружини є дискусія щодо просто використання varchar(255)для всіх varcharполів у тимчасових таблицях у збережених процедурах. В основному, один табір хоче використовувати 255, тому що він завжди буде працювати, навіть якщо визначення змінюється, а інший табір хоче дотримуватися розміру в вихідних таблицях для потенційних покращень продуктивності.

Чи правильно табір виступу? Чи є інші наслідки? Вони використовують SQL Server.


Я заперечую, що, можливо, вам не потрібні тимчасові таблиці в першу чергу. Для чого вони використовуються? Якщо вони потрібні, для чого використовуються ці конкретні стовпці? Чи використовуються вони в приєднаннях чи порівняннях будь-якого типу? Будь-який із основних стовпців неварчар, а не варчар?
Аарон Бертран

@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.