У меня есть таблица, в которой хранятся данные о производительности системы, каждая запись является вызовом какого-либо важного метода и состоит из имени метода, его продолжительности и токена - каждому запросу к системе присваивается уникальный токен и т. Д. все записи с одним и тем же токеном относятся к одному и тому же запросу, например:
CallName Duration Token
----------- ----------- -----------
GetData 121 12345
Process 800 12345
SaveData 87 12345
GetData 97 ABCDE
Process 652 ABCDE
SaveData 101 ABCDE
Меня интересуют сводные данные, сгруппированные по токену и CallName, например:
-- The total duration of each request, in descending order
SELECT Token, SUM(Duration) FROM Requests GROUP BY Token ORDER BY SUM(Duration) DESC
-- The average duration of each call, in descending order
SELECT CallName, AVG(Duration) FROM Requests GROUP BY CallName ORDER BY AVG(Duration) DESC
Теперь эта таблица потенциально очень большая, и меня будут интересовать только несколько верхних записей каждого запроса, поэтому я реализовал разбиение на страницы для обоих этих запросов. Проблема в том, что, поскольку эти запросы включают агрегатные функции, SQL-сервер в любом случае завершает сканирование таблицы.
Наверняка у других людей была эта проблема раньше?
Что мне действительно нужно, так это «индекс» по сумме (длительности), сгруппированный по токену, то есть таблица, в которой я могу делать такие вещи, как:
SELECT Token, SumToken FROM RequestTokens ORDER BY SumToken DESC
- Это действительно плохая идея?
- Если так, есть ли лучший способ?
- Каков наилучший способ сделать это? Будут ли срабатывать триггеры при INSERT / UPDATE / DELETE (где я обновляю статистические значения на основе старых значений и измененных данных) или мне лучше вручную обновлять мой «индекс» при обновлении этой таблицы?
Триггеры - лучшее решение, которое я придумал до сих пор, но я уже вижу, что это кошмар тупика / согласованности! : -S