У меня есть таблица, которая поддерживает данные о производительности системы, каждая запись - это вызов, сделанный для некоторого важного метода, и состоит из имени метода, его продолжительности и знак - каждый запрос к системе присваивается уникальный маркер и так все записей с тем же самым таким же запросом, например:«Индексирование» (также поддерживающая таблицу) совокупных данных в SQL Server 2005
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
Теперь эта таблица является potentia lly очень большой, и я только когда-либо буду интересоваться самыми лучшими записями каждого запроса, и поэтому я реализовал подкачку для обоих этих запросов. Проблема в том, что, поскольку эти запросы связаны с совокупными функциями, SQL-сервер в конечном итоге делает сканирование таблицы.
Несомненно, у других людей была эта проблема раньше?
Что мне действительно нужно здесь является «Индекс» на SUM (Продолжительность), сгруппированных по токена, то есть таблица, где я могу сделать что-то вроде:
SELECT Token, SumToken FROM RequestTokens ORDER BY SumToken DESC
- Является ли это действительно плохая идея?
- Если да, то лучший способ?
- Что было бы лучшим способом сделать это? Включится ли работа INSERT/UPDATE/DELETE (где я обновляю агрегированные значения на основе старых значений и измененных данных), или мне лучше было бы вручную обновить мой «индекс» при обновлении этой таблицы?
Триггеры - лучшее решение, с которым я дошел до сих пор, но я уже вижу, что это кошмар тупика/консистенции! : -S
В некоторых случаях индексированные представления полезны. –
Я задавался вопросом, что, однако, индексированные представления не могут использовать большинство (возможно, всех) совокупных функций (MAX, AVG и т. Д.) - http://www.sqlteam.com/article/indexed-views-in- sql-server-2000 – Justin