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

StackOverflow https://stackoverflow.com/questions/2210592

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

Это лучший ответ, потому что в 99% случаев вы должны нет Будьте предварительно оптимизировать, как это, лучше просто рассчитать его на лету.

Тем не менее, разработчики клиента прицеливаются на серверную сторону с ошибочными предвзятыми представлениями, как »По требованию вычисления ... полученных атрибутов ...- довольно часто недопустимо медленно", И это просто неправда. Правильная формулировка здесь будет"является редко недопустимо медленно".

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

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

Я предполагаю, что 2 простых состояния: текущее или не текущее.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top