Руководство по предварительно вычисленным атрибутам SQL
-
18-09-2019 - |
Вопрос
Часто я имею в виду совокупные или родительские организации, которые имеют атрибуты, полученные от их составляющих или детей. Например:
А
byte_count
а такжеpacket_count
аTcpConnection
Объект вычисляется из одних и тех же атрибутов двух его составляющихTcpStream
объекты, которые, в свою очередь, рассчитываются из их составляющейTcpPacket
объекты.Атмосфера
Invoices
объект может иметьtotal
которая в основном является суммой () его составляющейInvoiceLineItems
«Цены, с небольшим количеством грузов, скидки и налоговой логики.
При работе с миллионами пакетов или миллионов выставления счетов (я бы хотел!), Вычисление по требованию этих полученных атрибутов-либо в представлении, либо чаще в логике презентации, таких как отчеты или веб-интерфейсы-часто неприемлемо медленно.
Как вы решаете, прежде чем проблемы производительности заставят вашу руку, будь то «продвигать» полученные атрибуты в предварительно рассчитанные поля?
Решение
Я лично не будет обознавать, пока компромиссы производительности не затянут мою руку (потому что недостаток денормализаций будет слишком радикальным ИМХО), но вы также можете рассмотреть:
- Удобство: Например, если два разных клиентских приложения хотят рассчитать одни и те же полученные атрибуты, они оба должны кодировать запросы для их расчета. Денормализация предлагает оба приложения клиента более простым атрибутом.
- Стабильность с течением времени: Например, если формула для расчета полученного атрибута изменяется, денормализация позволяет вам запечатлеть и хранить полученное значение в тот момент времени, чтобы будущие расчеты никогда не поняли его неправильно
- Более простые вопросы: Добавление сложности в структуру БД может означать, что ваш выбор запроса проще в конце клиента.
- Производительность: Выберите запросы на денормализованные данные могут быть быстрее.
Ref: Программист базы данных: аргумент для денормализации. Анкет Обязательно прочитайте также его статью о Сохранение денормализованных значений правильными - Его рекомендация - использовать триггеры. Это приносит домой тот вид компромиссной денормализации.
Другие советы
В основном, вы этого не делаете. Вы оставили проблемы с производительностью заставляют вашу руку.
Это лучший ответ, потому что в 99% случаев вы должны нет Будьте предварительно оптимизировать, как это, лучше просто рассчитать его на лету.
Тем не менее, разработчики клиента прицеливаются на серверную сторону с ошибочными предвзятыми представлениями, как »По требованию вычисления ... полученных атрибутов ...- довольно часто недопустимо медленно", И это просто неправда. Правильная формулировка здесь будет"является редко недопустимо медленно".
Таким образом, если вы не являетесь экспертом в этом (архитектор DB Development и т. Д.), Вы не должны участвовать в преждевременной оптимизации. Подожди, пока это очевидный это должно быть исправлено, тогда Посмотрите на предварительную агрегацию.
Насколько текущие данные должны быть определяют, как вы их реализуете, на самом деле.
Я предполагаю, что 2 простых состояния: текущее или не текущее.
- Текущий: индексированные виды, триггеры, сохраненные запоздалы для поддержания совокупных таблиц и т. Д.
- Не текущий: снимки службы отчетности, доставка/репликацию журнала, хранилище данных и т. Д.
Тем не менее, я буду развиваться против того же количества данных, что и в Prod, поэтому я уверен в времени ответа. Вы редко должны быть удивлены своей производительности кода ...