Ведение статистики по таблицам SQL

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

Я мог бы обновлять X каждый раз, когда одна из моих таблиц изменяется, например так:

INSERT INTO Things VALUES (x, y, z);

UPDATE Stats
    SET AverageX = (SELECT avg(x) FROM Things WHERE Things.y="identifier")
    WHERE Stats.y="identifier";

Но это кажется неэффективным (усреднение каждый раз). Более того, возможно, что Stats не будет содержать запись, которая соответствует Stats.y="identifier"так что мне может понадобиться проверить это и, возможно, сначала создать запись.

Итак, вопрос: как приличные люди делают такие вещи?

1 ответ

Решение

Это слишком долго для комментария.

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

Тем не менее, вы должны делать это только при соблюдении следующих условий:

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

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

Обратите внимание, что некоторую статистику можно очень быстро рассчитать с помощью индексов - в частности, MIN() а также MAX(),

Поддержание триггеров нетривиально. И поддерживать согласованность между различными таблицами сложно (рассмотрим bulk insert или же truncate table которые не выполняют триггеры).

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