Руководство по предварительно вычисленным атрибутам SQL

Часто я имею дело с агрегатными или родительскими сущностями, которые имеют атрибуты, полученные из их составляющих или дочерних элементов. Например:

  • byte_count а также packet_count из TcpConnection объект вычисляется из тех же атрибутов двух составляющих TcpStream объекты, которые в свою очередь вычисляются из их составляющих TcpPacket объекты.

  • Invoices объект может иметь total который является в основном суммой () его составляющей InvoiceLineItemsцены, с небольшим фрахтом, скидкой и налоговой логикой.

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

Как вы решаете до того, как проблемы с производительностью заставят вас "продвигать" производные атрибуты в предварительно вычисленные поля?

3 ответа

Решение

Лично я не буду денормализовать, пока компромиссы производительности не заставят меня взяться за руку (потому что обратная сторона денормализации слишком радикальна, ИМХО), но вы также можете подумать:

  1. Удобство: например, если два разных клиентских приложения хотят вычислять одни и те же производные атрибуты, им обоим нужно кодировать запросы для их вычисления. Денормализация предлагает обоим клиентским приложениям производный атрибут более простым способом.
  2. Стабильность во времени: например, если формула для вычисления производного атрибута является изменяемой, денормализация позволяет захватывать и сохранять производное значение в определенный момент времени, поэтому будущие вычисления никогда не получат его неправильно
  3. Упрощенные запросы: добавление сложности к структуре БД может означать, что ваш запрос Select будет проще на стороне клиента.
  4. Производительность: Выбрать запросы к денормализованным данным можно быстрее.

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

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

Это лучший ответ, потому что в 99% случаев вам не следует проводить предварительную оптимизацию, лучше просто рассчитать ее на лету.

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

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

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

Я приму 2 простых состояния: текущее или нет текущего.

  • Текущий: индексированные представления, триггеры, хранимые процессы для поддержки таблиц агрегирования и т. Д.
  • Не актуально: снимки службы отчетов, доставка / репликация журналов, хранилище данных и т. Д.

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

Другие вопросы по тегам