Ведение статистики по таблицам 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", поэтому мне может потребоваться проверить это и, возможно, сначала создать запись.

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

Какая цель? Используйте триггеры.

jarlh 11.04.2018 14:02

Какой СУБД вы используете? «SQL» - это просто язык запросов, а не имя конкретного продукта базы данных. Добавьте тег для продукта базы данных, который вы используете postgresql, oracle, sql-server, db2, ...

a_horse_with_no_name 11.04.2018 14:12

В T-SQL (sql-server) для сумм и подсчетов могут использоваться индексированные представления; для минимумов и максимумов, к сожалению, нет.

Arvo 11.04.2018 15:26
0
3
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Однако делать это следует только при соблюдении следующих условий:

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

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

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

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

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