Подтвердить что ты не робот

SQL-соединения против единой таблицы: разница в производительности?

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

4b9b3361

Ответ 1

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

В большинстве случаев наличие хорошего набора индексов и актуальной статистики позволит решить большинство проблем производительности и блокировки без какой-либо денормализации.

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

Ответ 2

Майкл Джексон (не тот) лихо известно, что сказал,

  • Первое правило оптимизации программы: не делайте этого.
  • Второе правило оптимизации программы - только для экспертов: не делайте этого еще.

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

Многоэлементные SELECT почти всегда необходимы с нормированной моделью данных; как это часто бывает с таким вопросом, "правильным" ответом на "денормализацию"? вопрос зависит от нескольких факторов.

платформа СУБД.

Относительная производительность многосегментных запросов на основе одной таблицы зависит от платформы, на которой работает ваше приложение: уровень сложности оптимизаторов запросов может варьироваться. MySQL, например, по моему опыту, быстро кричит по однозарядным запросам, но не оптимизирует запросы с несколькими объединениями так хорошо. Это не реальная проблема с меньшими таблицами (скажем, менее 10 тыс. Строк), но на самом деле очень больно с большими (10 М +).

Объем данных

Если вы не смотрите на таблицы в области строк 100K +, проблема не должна быть проблемой. Если вы посмотрите на размеры таблиц в сотнях строк, я бы даже не подумал об индексировании.

(де-) нормализация

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

Требования/Ограничения

Какие требования к производительности вы пытаетесь выполнить? У вас есть фиксированное оборудование или бюджет? Иногда повышение производительности может быть самым простым - и даже самым дешевым - достигается при обновлении оборудования. Какие объемы транзакций вы ожидаете? Система бухгалтерского учета малого бизнеса имеет совсем другой профиль, например, Twitter.

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

Ответ 3

Разница в производительности?

Разница в степени безопасности.

Ответ 4

Мы оставляем оптимизацию запросов до базы данных по тем же причинам, что и мы, оставляем оптимизацию кода до компилятора.

Большинство современных RDBMSs в этом отношении довольно хороши в наши дни.

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

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

Ответ 5

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

Нормализация обычно предпочтительнее хранения данных в нескольких местах. Существуют сценарии, в которых вставка/обновление не требуется быстро, и выберите необходимость очень быстро, и в этом случае вам может быть лучше без нормализации. Тем не менее, преждевременная оптимизация не рекомендуется, поэтому сначала идите с нормальной структурой.

Ответ 6

Существует стоимость разложения таблиц для нормализации. Для этого есть компонент производительности. Стоимость выполнения разложения таблиц и объединение данных в запросах можно свести к минимуму за счет использования хорошей СУБД; проектирование таблиц вправо; проектирование индексов; позволяя оптимизатору выполнять свою работу; и настройка конкретных функций СУБД физического дизайна.

Существует также стоимость составления больших таблиц, которые реализуют объединения. Стоимость с точки зрения аномалий обновления и сложности программирования изложена в хороших учебниках по нормализации. Существует также стоимость исполнения для составления таблиц. Во многих продуктах СУБД загрузка очень большой строки в память стоит больше, чем загрузка меньшей строки. Когда вы составляете очень широкие таблицы, вы в конечном итоге вынуждаете СУБД читать очень большие строки, только чтобы отбросить большинство данных, считываемых в память. Это может замедлить вас даже больше, чем нормализация.

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

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

Ответ 7

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

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