Каким образом денормализация улучшает производительность базы данных? - PullRequest
58 голосов
/ 28 февраля 2010

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

Итак, мне просто любопытно, какие места в нормализованных БД ухудшают производительность или, другими словами, каковы принципы денормализации?

Как я могу использовать эту технику, если мне нужно улучшить производительность?

Ответы [ 8 ]

84 голосов
/ 28 февраля 2010

Денормализация обычно используется для:

  • Избегайте определенного количества запросов
  • Удалить несколько соединений

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


Быстрые примеры?

  • Рассмотрим таблицу «Посты» и «Комментарии» для блога
    • Для каждого сообщения в таблице «Комментарий» будет несколько строк
    • Это означает, что для отображения списка сообщений с соответствующим количеством комментариев вам необходимо:
      • Сделайте один запрос, чтобы получить список сообщений
      • Выполните один запрос на пост, чтобы подсчитать, сколько комментариев у него есть (Да, их можно объединить в один, чтобы получить номер для всех постов одновременно)
      • Что означает несколько запросов.
  • Теперь, если вы добавите поле «количество комментариев» в таблицу сообщений:
    • Вам нужен только один запрос, чтобы вывести список сообщений
    • И нет необходимости запрашивать таблицу комментариев: количество комментариев уже нормализовано к таблице сообщений.
    • И только один запрос, который возвращает еще одно поле, лучше, чем несколько запросов.

Теперь, есть некоторые расходы, да:

  • Во-первых, это занимает некоторое место как на диске, так и в памяти, поскольку у вас есть некоторая избыточная информация:
    • Количество комментариев хранится в таблице сообщений
    • И вы можете найти эти числа в таблице комментариев
  • Во-вторых, каждый раз, когда кто-то добавляет / удаляет комментарий, вы должны:
    • Сохранить / удалить комментарий, конечно же
    • Но также обновите соответствующий номер в таблице сообщений.
    • Но если в вашем блоге гораздо больше людей читают, чем пишут комментарии, это, вероятно, не так уж и плохо.
70 голосов
/ 28 февраля 2010

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

Существуют другие оптимизации пространства-времени, такие как

  • денормализованный вид
  • предварительно вычисленные столбцы

Как и при любом таком подходе, это улучшает чтение данных (потому что они легко доступны), но обновление данных становится более дорогостоящим (потому что вам необходимо обновить реплицированные или предварительно вычисленные данные) данные).

11 голосов
/ 28 февраля 2010

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

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

Одной из таких дисциплин дизайна является схема звезды. В схеме «звезда» одна таблица фактов служит центром звезды таблиц. Другие таблицы называются таблицами измерений, и они находятся на границе схемы. Измерения связаны с таблицей фактов отношениями, которые выглядят как спицы колеса. Схема «звезда» - это в основном способ проецирования многомерного проектирования на реализацию SQL.

С звездной схемой тесно связана схема снежинки, которая немного сложнее.

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

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

7 голосов
/ 02 марта 2010

Критически важные проблемы денормализации:

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

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

Однако это не принесет пользы, если мы не будем часто делать запросы, в которых нужны данные из промежуточных таблиц.

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

3 голосов
/ 28 февраля 2010

Если у вас есть определенные требования, такие как отчетность и т. Д., Это может помочь денормализовать вашу базу данных различными способами:

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

  • Вы можете предварительно вычислить определенные значения и сохранить их в столбце таблицы, чтобы они могли вычислять их на лету, каждый раз для запроса к базе данных. Конечно, эти вычисленные значения могут со временем «устаревать», и вам может понадобиться пересчитать их в какой-то момент, но просто считывание фиксированного значения обычно дешевле, чем вычисление чего-либо (например, подсчет дочерних строк)

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

1 голос
/ 28 февраля 2010

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

Допустим, мощность в среднем составляет 2x1.

У вас есть две таблицы, Parent, с p строками. Ребенок с 2x p строками.

Операция соединения означает для p родительских строк, 2x p дочерних строк должны быть прочитаны. Общее количество прочитанных строк: p + 2x p .

Рассмотрите возможность денормализации этого в единую таблицу, содержащую только дочерние строки, 2x p . Количество прочитанных строк составляет 2x p .

Меньше строк == меньше физического ввода-вывода == быстрее.

0 голосов
/ 20 февраля 2015

Согласно последнему разделу этой статьи,

https://technet.microsoft.com/en-us/library/aa224786%28v=sql.80%29.aspx

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

0 голосов
/ 08 ноября 2012

Преимущества нормализации по сравнению с нормализацией

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

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

...