Які наслідки встановлення варчару (8000)?


22

Оскільки varchar займає місце на диску пропорційно розміру поля, чи є якась причина, чому ми не завжди повинні визначати varchar як максимальний, наприклад, varchar(8000)на SQL Server?

Якщо я бачу, що хтось робить, varchar(100)я повинен сказати їм, що ви не помиляєтесь, що слід робити varchar(8000)?


Я думаю, що ми маємо тут розрізняти використання у створенні таблиці та використання в деклараціях параметрів збережених процедур. Для другого тлумачення дивіться моє запитання dba.stackexchange.com/questions/1772/…
— bernd_k

Відповіді:


18
  • Довжина - це обмеження для даних (наприклад, ПЕРЕВІРТИ, FK, NULL тощо)
  • Продуктивність, коли рядок перевищує 8060 байт
  • Не може мати унікальне обмеження або індекс (ширина стовпця ключа повинна бути <900)
  • За замовчуванням SET ANSI PADDING ON = потенціал для збереження безлічі пробілів
  • SQL Server передбачає, що середня довжина становить 4000 для операцій сортування, розподіляючи пам’ять на основі цього (потрібно знайти посилання для резервного копіювання, але іржавіє мені, поки я це роблю :-)

Підсумок: не робіть цього.


Продуктивність, коли рядок перевищує 8060 байт . Це стосується фактично використаних байтів, а не максимально дозволених байтів?
— bernd_k

@bernd_k: 8060 = найбільший обсяг даних для одного рядка, який вміститься в одну 8192 сторінку. Включити накладні рядки. Залишок (132 байти) = накладні сторінки
— gbn

Це означає, що продуктивність зменшується, коли більший розмір справді використовується, не з чистого факту, що його використання дозволено.
— bernd_k

@bernd_k: будь-яке зниження продуктивності спричинено 1. розподілом пам'яті для сортів тощо. 2. Переповнення рядків (> 8060 байт). Факт наявності 10 символів у кожному варшарі (8000) не має значення, поки ці умови не будуть виконані (SQL попереджатиме про можливі помилки пізніше для індексних ключів)
— gbn

Чи варто сортувати таблицю зі стовпцем varchar (100), заповненою полями довжиною 100 байт, ще одне питання, оскільки сортування передбачає в середньому 50 символів?
— bernd_k

7

Якщо припустити, що ви посилаєтесь на SQL Server, я можу придумати один.

Існує обмеження розміру (8K) рядка в таблиці, і SQL дозволяє визначати поля varchar, які теоретично можуть перевищувати цю межу. Таким чином, користувач може отримати помилки, якщо він помістить занадто багато даних у поле, пов’язане з цим.

Починаючи з SQL 2K8, ви можете перевищити цю межу, але є наслідки для продуктивності .

Крім того, існує ціла перевірка розумності обмеження розміру на те, як ви очікуєте, щоб вони виглядали. Якщо ви хочете поле без обмеженої довжини, чому б не перейти з текстом або ntext?


тому типи даних тексту та ntext зберігаються таким чином, що не впливають на продуктивність?
— Чад

Ці типи не вносять стільки до обмеження розміру 8K рядків у таблиці, оскільки фактичні дані зберігаються в окремій таблиці під обкладинками, а не в рядку з рештою стовпців. Вплив на ефективність все ще є, але з різних причин. Також є обмеження щодо підтримки функцій у цих полях порівняно з varchar та nvarchar
— JohnFx

текст і ntext застаріли на користь varchar (max).
— Філ Хельмер

3

Звичайно, це залежить від того, яка інформація зберігається в полі?

Деякі речі матимуть максимальну довжину з ряду причин, а якщо має бути максимальна довжина, то це має бути довжина вашого поля.

Якщо теоретично немає максимальної довжини, я б поставив під сумнів, чому варчар буде використовуватися.


3

У контексті баз даних Oracle я дізнався, що завжди використання найменшого розміру поля для стовпців бази даних має один провал.

При переміщенні даних за допомогою експорту імпорту з бази даних з однобайтовим зіставленням до однієї з множинним байтовим порівнянням (наприклад, Oracle XE) довжина в байтах може збільшуватися, а імпортування даних у таблиці, створені імпортом, не вдається. Звичайно, Oracle має можливість визначити довжину varchar2 або як char, або як байт.

Моя думка тут полягає в тому, що не завжди розумно визначати поле з завжди якомога меншим. Я бачив багато таблиць змін, щоб пізніше збільшити поле з полями (спричинене зміненими вимогами).

Маючи 20% - 100% невикористаного поля, тут є дискусійним варіантом.

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