Чи порожні стовпці займають місце в таблиці?


20

У мене є таблиця, яка вміщує в собі дуже основну інформацію. Просто заголовок та кілька полів дати. Існує одне поле під назвою коментарі, яке є varchar (4000) Більшу частину часу ми залишаємо його порожнім, але іноді тут буде вводитися велика кількість даних. Це справді поганий дизайн? Або це просто трохи неефективно?

Я б припустив, що краще створити окрему таблицю для цього стовпця.

Примітка: це сервер sql 2008

введіть тут опис зображення


Дякую за відгук усім! Я вирішив зробити це просто і тримати стовпчик у таблиці, а не класти його в іншу таблицю. Однак я використовував функцію SPARSE в SQL 2008, тому поле не використовує пробілу.

2
Просто цікаво, що таке "більшість часу"? Скільки рядків усього, і який відсоток має тут значення? Цікаво, чи плануєте ви порівняння простору та продуктивності, використовуючи, SPARSEа не використовуючи SPARSE...
Аарон Бертран

Відповіді:


9

Для отримання більш передбачуваної продуктивності (і щоб уникнути великої різниці рядків на сторінці), я схиляюся до зберігання цих даних у відповідній таблиці - особливо, якщо вона заповнена лише невеликим відсотком часу, і особливо, якщо вона отримана лише в деякі запити. Рядки, де це значення, дійсно NULLсприяють простору накладних витрат, але це мінімально. Більш важливим буде те, як одна сторінка може вміщувати лише два ряди, а наступна сторінка може вміщувати 500 рядків - це може дійсно вплинути на статистику, і ви, можливо, краще розділити це, щоб воно зберігалося окремо і не впливало на всі ваші операції на основна таблиця.


12

Займає мінімальний простір, коли не використовується

  • один біт у растровій карти NULL
  • два байти по довжині (яка буде нульовою, коли NULL)

Накладні витрати мінімальні, і оптимізація буде передчасною.

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

Дивіться /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 для отримання додаткових відомостей


10

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

  • Сторінка даних містить близько 8000 байт
  • У вас є кілька рядків із значенням 100 байт, а деякі рядки - понад 4000 байтів
  • Ці довгі рядки опиняться на самій сторінці, а решта сторінки - це "витрачений" простір, який займає ваша БД, але, ймовірно, ніколи не зберігатиме дані
  • Якщо ви додасте дані в це довге поле для запису на сторінці, що знаходиться в основному на повній, це, ймовірно, перекриє сторінку та призведе до вказівника на сторінку з рештою запису

Усі ці порожні сторінки та покажчики призводять до низької продуктивності. Нормалізуйте це поле, якщо можете.


4

Це питання виглядає дуже схоже: чи впливають зайві порожні стовпці на розмір таблиці sql?

Схоже, відповідь "так", вона займає місце, але існує алгоритм стиснення для стовпців з великою кількістю нульових значень.

Що стосується дизайну, я думаю, що мати зовнішній стіл, пов'язаний з цим, було б більш чистим дизайном. Наявність стовпця з частими нульовими значеннями ускладнює користувачів бази даних, оскільки вони можуть випадково використовувати нульове значення, якщо вони не обережні. Тому код, що використовує базу даних, повинен містити перевірку помилок, і звідти він просто стає некрасивим.


2
Щоб бути явним, алгоритм стиснення застосовується лише до тих стовпців, які явно визначені як SPARSE, а не лише "стовпці з великою кількістю нульових значень".
Аарон Бертран

2

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

Що стосується того, щоб помістити його в іншу таблицю, я б не переймався. Можна також переглянути варіанти varchar (max) та параметри введення / виходу рядків. Знову, напевно, передчасно.


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

@Aaron Bertrand Погодився. Тут люди задають питання щодо продуктивності, і неважко припустити, що у них може бути додаток, що становить мільйони рядків, і їм потрібно використовувати кожну зброю в наборі інструментів, і пам'ятати про це. З іншого боку, іноді користувач, здається, знаходиться на початку кривої навчання, і важко попросити їх виділити час на те, що, мабуть, буде нижчим за їхні пріоритети. Крім того, за допомогою varchar (max) ви ефективно можете натиснути на перемикач, щоб почати зберігати його поза рядками. Я думаю, що справжня відповідь тут "Ви насправді не дали нам достатньо інформації, щоб дати остаточну відповідь".
Кейд Ру
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.