Как денормализовать сильно нормализованную систему баз данных? - PullRequest
3 голосов
/ 27 апреля 2009

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

У меня большой набор баз данных, которые развивались в течение десяти лет и находятся под возрастающей нагрузкой, поэтому я стремлюсь улучшить ПРОИЗВОДИТЕЛЬНОСТЬ и, возможно, уменьшить сложность некоторых запросов.

Нередко 10 соединений объединяются для выполнения любой заданной задачи в хранимой процедуре. Мне сказали, что более 6 воняет.

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

Несколько советов по передовому опыту или продвижению в правильном направлении помогут.

Спасибо

Ответы [ 5 ]

11 голосов
/ 27 апреля 2009

Вы не говорите, в чем проблема. Это производительность? Если да, то на каких столах?

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

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


При редактировании: мне вспоминается время, когда на работе возникали проблемы с производительностью. очень медленные хранимые процедуры, которые могут занять минуты. Оказалось, что эти sps выполняли совершенно нормальные обновления таблиц, , но с использованием курсоров . Для таких простых вещей, как update t set c = c + 1 where id = n.

Итак, чтобы сделать обновление, мы курсировали по ряду строк с помощью дорогостоящего курсора обновления и declare cursor for "select c from t where id = n" for update; затем открывали курсор и читали и проверяли на наличие ошибок, а также цикл с проверкой на чтение и на ошибку, а затем select c into @c; @c = c + 1; update t set c = @c where current of cursor; за каждое обновление.

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

2 голосов
/ 27 апреля 2009

Некоторые вещи для расследования

  • Оцените все времена выполнения запроса - дайте себе показатель для сравнения.
  • Исследование индексации выполнено правильно.
  • Читать на разбиение таблицы .
  • Изучите шардинг как опцию .
  • Посмотрите на ваши соединения внимательно. Ты всегда объединяешься за одним столом? Если ответ не столь очевиден, вы все равно можете создавать логические деления (например, ваши денормализованные таблицы), используя представления.
1 голос
/ 27 апреля 2009

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

0 голосов
/ 27 апреля 2009

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

Кроме того, в зависимости от ваших настроек может быть индексированный вид

0 голосов
/ 27 апреля 2009

Я должен согласиться, 10 объединений - это зло и убьет вашу работу.

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

Если вы собираетесь заняться денормализацией, я бы не стал добавлять новые таблицы "кеша". Это действительно просто исправление проблемы. Я хотел бы сформулировать полный план денормализации базы данных с помощью новой оптимизированной схемы.

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