Есть ли снижение производительности, если в таблице слишком много столбцов?

Есть ли потеря производительности за счет большого количества столбцов в таблице, помимо увеличения общего объема данных? Если да, поможет ли ситуацию разделение стола на несколько меньших?


person Richard Knop    schedule 13.08.2010    source источник


Ответы (9)


Если вам действительно нужны все эти столбцы (то есть это не просто признак того, что у вас плохо спроектированная таблица), непременно сохраните их.

Это не проблема производительности, если вы

  • используйте соответствующие индексы для столбцов, которые необходимо использовать для выбора строк
  • не извлекайте столбцы, которые вам не нужны в операциях SELECT

Если у вас 30 или даже 200 столбцов, это не проблема для базы данных. Вы просто усложняете ему работу, если хотите получить сразу все эти столбцы.

Но наличие большого количества столбцов - плохой запах кода; Я не могу придумать какой-либо законной причины, по которой хорошо спроектированная таблица будет иметь такое количество столбцов, и вместо этого вам может потребоваться связь «один-много» с какой-либо другой, гораздо более простой таблицей.

person thomasrutter    schedule 13.08.2010
comment
Я вижу одну причину, которую считаю законной: при загрузке устаревшего или проприетарного (индексированного или csv) файла в таблицу, чтобы использовать возможности базы данных для ее использования. - person snowflake; 13.08.2010
comment
@snowflake: Вот как это происходит, но неприятный запах кода остается, и данные / схему следует проверять на предмет возможных рефакторингов. - person Donal Fellows; 13.08.2010
comment
Я не понимаю, что означает «неприятный запах» или «плохо спроектированный», кроме субъективного мнения .... пожалуйста, объясните - person GLAND_PROPRE; 16.06.2016
comment
В этих терминах действительно есть некоторая субъективность. Плохой запах означает в некотором коде признак того, что ваше приложение может быть плохо спроектировано. Это не обязательно означает, что это так, но кто-то другой, читающий ваш код, скорее всего, сделает такой вывод. Плохо спроектированный означает не кодирование чего-либо разумным или эффективным способом, использование инструментов, не предназначенных для использования, и т. Д. В этом случае это может указывать на то, что вам нужно пересмотреть, как нормализовать структуру базы данных. - person thomasrutter; 17.06.2016

Я не согласен со всеми этими сообщениями, утверждающими, что 30 столбцов пахнут плохим кодом. Если вы никогда не работали с системой, в которой была сущность с 30+ допустимыми атрибутами, то у вас, вероятно, не так много опыта.

Ответ, предоставленный HLGEM, на самом деле лучший из всех возможных. Мне особенно нравится его вопрос «есть ли естественное разделение ... часто используемые и не часто используемые?» - очень хорошие вопросы, которые стоит задать себе, и вы можете разделить таблицу естественным образом (если все сложится). из рук).

Мой комментарий был бы следующим: если ваша производительность в настоящее время приемлема, не пытайтесь изобретать новое решение, если оно вам не нужно.

person Wade    schedule 27.07.2011
comment
Каждый вправе иметь собственное мнение. Унизить кого-то из-за того, что он разделяет мнение, которое встречается в каждой книге, просто не кажется оправданным. Я работал над многими системами, и в каждой из них были таблицы с более чем 30 столбцами, но запах остался. Просто потому, что он там и находится в производстве, еще не значит, что это правильно. - person Nicktar; 28.07.2011
comment
Правильно, я работаю над ERP, разработанной oracle, с более чем 50 столбцами в наиболее часто используемых таблицах. - person Muhammad Saqib; 04.09.2019

Я собираюсь взвесить это, даже если вы уже выбрали ответ. Да, слишком широкие таблицы могут вызвать проблемы с производительностью (а также проблемы с данными), и их следует разделять на таблицы с отношениями один-один. Это связано с тем, как база данных хранит данные (ну, по крайней мере, в SQL Server не уверены в MySQL, но стоит почитать документацию о том, как база данных хранит данные и получает доступ к ним).

Тридцать столбцов могут быть слишком широкими, а может и нет, это зависит от их ширины. Если вы сложите общее количество байтов, которое займут ваши 30 столбцов, будет ли оно больше максимального количества байтов, которое может быть сохранено в записи?

Некоторые из столбцов вам понадобятся реже, чем другие (другими словами, существует ли естественное разделение между требуемой и часто используемой информацией и другими данными, которые могут появляться только в одном месте, а не где-либо еще), тогда рассмотрите возможность разделения таблицы.

Если некоторые из ваших столбцов представляют собой такие вещи, как phone1, phone2, phone3 - тогда не имеет значения, сколько столбцов у вас есть, вместо этого вам нужна связанная таблица с отношением «один ко многим».

В общем, хотя 30 столбцов не являются необычно большими и, вероятно, будут в порядке.

person HLGEM    schedule 13.08.2010

С технической точки зрения 30 столбцов - это абсолютно нормально. Однако таблицы с большим количеством столбцов часто являются признаком того, что ваша база данных не нормализована должным образом, то есть она может содержать избыточные и / или несогласованные данные.

person tdammers    schedule 13.08.2010

Должно быть хорошо, если только у вас не select * from yourHugeTable повсюду. Всегда выбирайте только те столбцы, которые вам нужны.

person Vincent Buck    schedule 13.08.2010

30 мне кажется не слишком много. В дополнение к необходимым индексам и правильным запросам SELECT для широких таблиц применимы два основных совета:

  1. Определите столбец как можно меньше.
  2. Избегайте использования динамических столбцов таких как VARCHAR или TEXT, насколько это возможно, когда у вас есть большое количество столбцов в таблице. Попробуйте использовать столбцы фиксированной длины, например CHAR. Это сделано для того, чтобы сэкономить дисковое пространство для производительности.

Например, для столбцов «имя», «пол», «возраст», «биография» в таблице «человек» до 100 или даже более столбцов, чтобы максимизировать производительность, их лучше всего определить как:

  1. имя - CHAR (70)
  2. пол - TINYINT (1)
  3. возраст - TINYINT (2)
  4. био - ТЕКСТ

Идея состоит в том, чтобы определять столбцы как можно меньше и по возможности фиксированной длины. Динамические столбцы должны находиться в конце структуры таблицы, поэтому перед ними ВСЕ столбцы фиксированной длины.

Само собой разумеется, что это приведет к огромному объему дискового пространства, потраченному впустую из-за большого количества строк, но если вам нужна производительность, я предполагаю, что это будет цена.

Еще один совет: по мере продвижения вы обнаружите столбцы, которые гораздо чаще используются (выбираются или обновляются), чем другие, вам следует разделить их в другую таблицу, чтобы сформировать связь один к одному с другой таблицей, которая содержит редко используемые столбцы и выполняет запросы с меньшим количеством задействованных столбцов.

person datasn.io    schedule 19.10.2014

30 столбцов обычно не считаются чрезмерным числом.

С другой стороны, три тысячи столбцов ... Как бы вы реализовали очень широкий стол?

person Community    schedule 13.08.2010

Помимо производительности, нормализация базы данных необходима для баз данных со слишком большим количеством таблиц и отношений. Нормализация дает вам легкий доступ к вашим моделям и гибкие отношения для выполнения различных запросов sql.

Как показано здесь, существует восемь форм нормализации. Но для многих систем достаточно применения первой, второй и третьей нормальных форм.

Таким образом, вместо выбора связанных столбцов и написания длинных SQL-запросов лучше использовать хорошие нормализованные таблицы базы данных.

person FallenAngel    schedule 13.08.2010
comment
Я давно читал такие документы и знаю о них ... Но, как я уже сказал, наиболее часто используемые формы нормализации - это первые три. Остальное обычно не используется. Моей свинке была показана общая информация о нормализации. И да, он говорит о 8, но действительно сложно найти информацию о нормализации за пределами 5-й нормальной формы и BCNF и DKNF. Но вы правы (: - person FallenAngel; 13.08.2010
comment
@ mp0int - если вы отредактируете свой ответ, я могу удалить отрицательный голос - он сейчас заблокирован. - person ; 13.08.2010

С точки зрения использования это уместно в некоторых ситуациях, например, когда таблицы обслуживают несколько приложений, которые используют одни столбцы, но не другие, и где для отчетности требуется единый пул данных в реальном времени для всех, без передачи данных. Если таблица из 200 столбцов обеспечивает такую ​​аналитическую мощь и гибкость, то я бы сказал «открывайте длинную позицию». Конечно, в большинстве ситуаций нормализация обеспечивает эффективность и является наилучшей практикой, но делайте то, что вам нужно.

person BarryDevSF    schedule 13.08.2015