Каким образом денормализация повышает производительность базы данных?


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

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

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

8 57

8 ответов:

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

есть и другие пространственно-временной оптимизации, такие как

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

критические вопросы в денормализации являются:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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