Уменьшает ли количество атрибутов в таблице производительность? - PullRequest
6 голосов
/ 21 января 2010

Пока мне вполне комфортно работать с приложением C # windows. Я собираюсь перейти на Asp.net для разработки веб-сайта. Требование заставило меня поместить около 50 столбцов в одну таблицу. Я знаю эту концепцию разбиения на маленькие таблицы с использованием нормальных форм.

Я пробовал поискать в Google, но я не получил много результатов. Мне нужно знать, снизит ли моя таблица с 50 атрибутами производительность моего веб-приложения? Может кто-нибудь подсказать мне об этом.

Ответы [ 9 ]

2 голосов
/ 21 января 2010

Что ж, если вы вернете их всех обратно, у вас наверняка будут расходы на сеть (передача данных между БД и вашим кодом .NET) и затраты на материализацию (создание представления объекта / DataTable в вашем DAL), так что тогда вы бы определенно есть некоторые расходы. В любом случае вы должны учитывать размер страницы базы данных.

Но, возможно, ключевой момент: вам нужны все данные? Если это так, вы можете сделать так много. Использование нескольких таблиц и введение объединений также влияют на производительность.

В большинстве случаев, и особенно ASP.NET, наиболее важные цифры - это такие вещи:

  • данные какого объема на самом деле отправляются клиентскому приложению? (не могли бы вы использовать пейджинг / ajax /. etc?)
  • какие данные хранятся в сессии?
  • сколько обходов вы совершаете между клиентом и сервером приложений?

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

Кроме того, ASP.NET имеет репутацию не стесняющегося хранить больше, чем вы ожидаете в таких вещах, как view-state; следите за этим или переключитесь на более легкую модель, такую ​​как ASP.NET MVC.

0 голосов
/ 09 сентября 2011

Важно не количество столбцов в таблице, а "ширина" таблицы.

Например, если все 50 из этих столбцов являются бит столбцами, то вы смотрите на 7 байтов в строке, что составляет крошечный .

С другой стороны, если все 50 столбцов являются VARCHAR(4000) столбцами, то вы смотрите на потенциальный максимальный размер строки около 200 МБ на строку (да, SQL Server позволит вам это сделать), что, очевидно, может вызвать проблемы (на самом деле это, вероятно, не будет, но я хочу сказать, что важна ширина данных, а не количество столбцов.

Только верный способ узнать, возникнут ли у вас проблемы, - это попробовать и увидеть, но как правило очень общее хорошая идея попытаться сохранить размер строки ниже 4 КБ (1 страница), однако это очень общее правило:

  • Обычно вы, вероятно, хотите, чтобы размер строки был на намного * на 1022 * меньше этого значения, чтобы вы могли разместить много строк на странице
  • Однако, если в вашей таблице есть пара больших полей объекта (например, VARCHAR или VARCHAR(MAX)), размеры строк, вероятно, будут довольно регулярно превышать 4 КБ, это нормально.

Это сложный вопрос - как я сказал, единственный верный способ узнать это попробовать и посмотреть, работает ли он.

Обратите внимание, что за исключением крупных объектов (таких как VARCHAR), SQL Server не позволит вам создать строку размером более 1 страницы.


Почему "широкая" таблица может вызвать проблемы?

Потому что это увеличивает объем данных, которые необходимо прочитать.

В качестве очень простого / надуманного примера предположим, что у вас есть таблица, упорядоченная по идентификатору (то есть имеет кластеризованный индекс по идентификатору), и вы хотите получить записи для идентификаторов от 100 до 110 включительно. Если размер строки небольшой (скажем, 200 байт), то размер всех этих записей вместе составляет около 2 КБ, что намного меньше размера страницы (4 КБ). Поскольку таблица упорядочена по идентификатору, очень вероятно, что все эти записи помещаются на 1 странице, максимум на 2, и поэтому для чтения всех 10 записей требуется всего пара чтений.

Теперь предположим, что размер строки больше (скажем, 2 КБ), тогда общий размер всех этих записей теперь составляет 20 КБ. Минимальное количество необходимых чтений теперь составляет как минимум 5, возможно 6. На занятом сервере базы данных эти чтения приводят к дополнительным операциям ввода-вывода и дополнительной нагрузке на память в cahce.

крупные объекты

В зависимости от объема хранимых данных поля больших объектов и переменной длины (например, VARCHAR) могут хранить данные на отдельных страницах, либо на страницах больших объектов, либо на страницах с переполнением строк.

Что это значит? Если у вас есть таблица с множеством таких столбцов, и вы выполняете запрос SELECT * ..., то SQL Server должен извлечь все эти дополнительные страницы, чтобы прочитать все эти дополнительные данные. В итоге получается та же ситуация, что и выше - много операций чтения, что плохо .

Однако, если вместо этого мы указываем только некоторые столбцы в нашем запросе, например, SELECT ID, Address ... тогда SQL Server не нужно беспокоиться о чтении страниц, которые содержат данные, которые нам не интересны. Несмотря на то, что эта таблица может определять много столбцов с огромной шириной строки, потому что мы указали интересующие нас столбцы и поскольку эти данные хранятся на отдельных страницах, количество операций чтения все еще относительно низкое.

0 голосов
/ 21 января 2010

В зависимости от того, что вы на самом деле имеете в виду, это может быть или не быть проблемой.

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

Если это такие вещи, как phone1, phone2 и т. Д., Вам нужна связанная таблица, так как ее трудно поддерживать и правильно запросить. Например, предположим, что у вас сейчас есть пятьдесят полей для телефонных номеров, и наступает день, когда вам нужно 51, тогда вы должны изменить структуру таблицы и все связанные запросы (вы не используете select * in production, не так ли?) Предположим, вы хотите чтобы узнать, у кого есть телефонный номер 111-111-1111, вы должны присоединиться (или объединиться) к столу 50 раз, чтобы получить ответ. Вот где это может ухудшить производительность.

В третьем случае каждый из 50 столбцов - это разные вещи, но вместе они будут большой записью из-за размера полей. Поймите, что базы данных позволят вам создать структуру, размер которой превышает максимальное число байтов, которое может содержать запись, просто она не позволит вам добавить больше, чем это количество байтов в записи. Плюс более длинные записи имеют тенденцию создавать проблемы в том, как данные хранятся на диске, и могут привести к более медленному извлечению. В этом случае лучше всего создать одну или несколько связанных таблиц, которые будут иметь отношение один к одному с основной таблицей.

0 голосов
/ 21 января 2010

"Сделай самое простое, что могло бы сработать." (Уорд Каннингем).

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

Удачи.

0 голосов
/ 21 января 2010

Это зависит от того, что и как извлекаются данные. Конечно, SELECT * скажется на производительности. Вам нужно будет выбрать необходимые столбцы и попытаться использовать предложение where. Это один из способов сделать из таблицы с большим количеством столбцов и данных.

0 голосов
/ 21 января 2010

все сводится к тому типу запросов, которые вы будете использовать. в конце дня это объем данных, которые вы будете извлекать из / записывать в таблицу. если большинство ваших запросов извлекаются из / пишутся в большинство столбцов, да, нет столбцов будет иметь влияние.

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

сказав, что 50 столбцов - это не большое число. я наткнулся на таблицы с более чем 300 столбцами. но это также зависит от используемых вами БДМ.

0 голосов
/ 21 января 2010

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

Ненормализация также популярна. Выберите степень нормализации в логике приложения. (Тщательно продумайте СОЕДИНЕНИЯ)

0 голосов
/ 21 января 2010

Одна таблица, 50 столбцов?

Одна из нормальных ситуаций - избегать вставки, удаления, обновления аномалий

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

0 голосов
/ 21 января 2010

Если вы говорите о таблице БД со множеством полей (или столбцов), то 50 не является чем-то необычным.

Тем не менее, вы должны поддерживать нормализованный дизайн БД, и если проект нормализован с 50 полями, используйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...