システムのパフォーマンス データを保持するテーブルがあります。各レコードは、いくつかの重要なメソッドに対して行われた呼び出しであり、メソッド名、その期間、およびトークンで構成されています。システムへの各要求には一意のトークンが与えられるため、すべての同じトークンを持つレコードは同じリクエストです。例:
CallName Duration Token
----------- ----------- -----------
GetData 121 12345
Process 800 12345
SaveData 87 12345
GetData 97 ABCDE
Process 652 ABCDE
SaveData 101 ABCDE
Token と 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 サーバーが最終的にテーブル スキャンを実行することです。
確かに他の人は以前にこの問題を抱えていましたか?
ここで本当に必要なのは、トークンでグループ化された SUM(Duration) の「インデックス」です。つまり、次のようなことができるテーブルです。
SELECT Token, SumToken FROM RequestTokens ORDER BY SumToken DESC
- これは本当に悪い考えですか?
- もしそうなら、より良い方法はありますか?
- これを行う最良の方法は何ですか?INSERT / UPDATE / DELETE (古い値と変更されたデータに基づいて集計値を更新する場所) でトリガーしますか、またはこのテーブルを更新するときに「インデックス」を手動で更新する方がよいでしょうか?
トリガーは私がこれまで思いついた最良の解決策ですが、これがデッドロック/一貫性の悪夢であることはすでにわかっています! :-S