завищення розміру поля в дизайні бази даних


11

У мене є кілька полів для моїх таблиць, які є рядками, і на даний момент більшість розмірів поля мають досить високі обмеження символів. Наприклад, 100 знаків для назви вулиці. Чи існує штраф за використання великого розміру поля? Якщо я зміню, наприклад, обмеження на 30 знаків для цього поля, чи буде підвищення продуктивності чи ефективність із розміром? Там було б близько 50 полів, які можуть бути кандидатами на усадку.

Дякуємо за ваші пропозиції.


Для char, у базі даних завжди використовується простір, але для varchar, хоча штраф буде меншим, потреба у виділенні більшого простору під час операцій, які вам справді потрібні, також можуть зробити це трохи менш ефективним. Я б не турбувався про стовпчики varchar, якщо вони не дуже великі - як завжди, використовуючи varchar (max) або varchar (1000).
Кейд Ру

Ви повинні пам’ятати про перевищення розміру однієї сторінки (8 к), оскільки це вплине на продуктивність. Перевірте цю публікацію: stackoverflow.com/questions/2518922/…

Враховуючи низьку вартість жорстких дисків, я б не турбувався про ефективність зберігання в наші дні. Як каже JNK, впливає на індексацію дуже великих полів - це, безумовно, варто пам’ятати. Біль від зміни програми, оскільки ви виділили занадто мало місця, набагато більша, ніж вартість декількох зайвих байтів у вашій таблиці бази даних.
Невілл Куйт

3
Я думаю, що ігнорування зберігання, оскільки це дешево, це погана ідея. Кожен байт на диску повинен бути вилучений та оброблений, і найповільніша частина майже кожної установки SQL Server - це дискове сховище. Менше байтів = швидші запити.
JNK

1
Якщо 100 МБ змусить на 20% менше даних поміститися в кеш-пам'ять дисковода 512 МБ, це буде абсолютно важливим (голос досвіду).
Ерік Дж.

Відповіді:


16

Якщо ви говорите про, varcharа nvarcharпотім ні, немає штрафу за допустимість більшої довжини поля.


Однак слід пам’ятати про деякі застереження:

  • Існує 2 байти накладних даних на рядок для полів змінної довжини (на поле). Якщо у вас дуже коротке поле, можливо, буде більше сенсу використовувати CHAR. Varchar(2)наприклад, насправді використовується від 2 до 4 байтів на рядок, тоді як CHAR(2)завжди використовується 2.
  • Дуже довгі поля не можна індексувати. Максимальна довжина для всіх полів у наборі ключів індексу - 900 байт.
  • Якщо ви дозволите більше даних, ніж ви очікували, з часом ви отримаєте несподівані результати. Якщо ви дозволите 100 символів для назви вулиці, можливо, в якийсь момент інші дані потраплять у це поле, не знаючи про це (наприклад, всю адресу). Якби він був відповідного розміру, ви, швидше за все, отримаєте помилку при вставці.
  • Дозволення дуже широких рядків може призвести до розбиття сторінки та фрагментації. Якщо у вас рядок довший 8 к, його потрібно буде розділити на кілька сторінок даних. Багато з них можуть дійсно зашкодити продуктивності. Вузьке в цілому є більш ефективним.

1
До цієї відповіді можна також додати застереження, наприклад, переконайтеся, що стовпчик принаймні великий: адреса varchar (30) не може впоратися з декоративним приводом дендропарку Болдервуд або індустріальним парком на північному сході Кентуккі .

@Aleksi - дуже правда. Я думаю, що це є більш очевидним, саме тому ОП використовує широкі поля для початку.
JNK

"в якийсь момент інші дані, ймовірно, потраплять у це поле, не знаючи про це" Цікавий момент. Я бачив безліч систем, де користувачі сприймали будь-яке поле, яке не було застосовне до цього запису, як поле для коментарів загального призначення.


2

Якщо ви маєте на увазі "Чи існує штраф за оголошення розміру поля більшим за будь-які значення, які фактично зберігаються в ньому?", То поки це оголошено варчаром, відповідь - ні. Кожен двигун SQL БД, який я знаю, зберігає лише кількість символів, фактично вказаних у даних (плюс значення довжини). Отже, якщо ви визначите поле як varchar (100), але в ньому зберігається лише 10 символів, воно буде містити лише 10 символів на диску (плюс 2 байти або близько того по довжині). Коли ви сумніваєтесь, я звичайно роблю свої варчарські поля смішно великими.

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

Майте на увазі, що якщо ви дасте користувачеві велике поле для введення даних, він рано чи пізно ним скористається.

Все, що сказано, я б помилявся на стороні занадто великого, а не занадто малого. Місце на диску досить дешеве, що ви не хочете змушувати користувачів вигадувати абревіатури під час руху, оскільки вони не можуть вписати реальні дані у доступне поле. У системі, над якою я сьогодні працюю, є поле для опису продукту, яке є занадто малим для багатьох справжніх назв нашої продукції, тому користувачам доводиться скорочувати. І звичайно, кожен користувач скорочує по-різному, тому у нас є двадцять різних способів сказати те саме.


2

Кожен, хто стверджує, що за оголошення розміру поля більшим, ніж те, що насправді буде зберігатися в таблиці, не передбачено жодного штрафу. Фактичний розмір даних (плюс 2 байтові накладні витрати) - це те, що фактично зберігається, але саме визначення стовпця використовується для визначення оцінки, наскільки йде план виконання. Отже, хоча оголошення вархара (1000) для зберігання значення 10 символів буде з'їдати лише 12 символів дискового простору, оцінки плану виконання будуть набагато менш ефективними та негативними, щоб перекривити результати, як на кількість пам'яті для надання операції, так і на незалежно від того, чи операція може виконуватися виключно в пам'яті, або також буде потрібно також простір накопичувача tempdb. Ви можете зробити свій колонку varchar (1000), але двигун не знає, що всі ваші збережені значення дійсно менше, ніж varchar (10),


0

Перевірка довжини поля - це те, що ви отримуєте "безкоштовно", тобто вам не потрібно використовувати CHECKобмеження, щоб зробити те саме. І ви не хочете, щоб великі значення даних були, коли, наприклад, вам доведеться завантажувати свої дані до іншої бази даних, яка обмежила той самий елемент даних до 35 символів відповідно до міжнародної стандартної адреси.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.