Ведение статистики по таблицам 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
которые не выполняют триггеры).