私のクエリに関して、似たような質問やよく似た質問を見つけることができました。しかし、同じことを行うより良い方法があるかどうか知りたいです。
Web サービス エンドポイントへの呼び出しによって入力されるデータベース テーブルがあります。特定のイベントが発生し、新しいレコードがこのテーブルに挿入されると、エンドポイントが呼び出されます。イベントはリアルタイムで発生し、イベントの発生頻度やパターンは決まっていません。
テーブルは次のようになります。
CREATE TABLE MyTbl(id int, type nvarchar(10), timestamp datetime, category nvarchar(50));
次のようにテーブルからデータを取得しています。
SELECT category,
COUNT(CASE WHEN type = 'sent' THEN 1 END) sent,
COUNT(CASE WHEN type = 'received' THEN 1 END) received,
COUNT(CASE WHEN type = 'blocked' THEN 1 END) blocked,
COUNT(CASE WHEN type = 'opened' THEN 1 END) opened
FROM MyTbl
WHERE timestamp >= '2013-01-01 00:00:00' AND timestamp < '2013-02-01 00:00:00'
GROUP BY category
およびレポートの詳細についてはdatabase schema
、こちらをご覧ください。sample data
select-query
次のことを考えると:
- データはリアルタイムでテーブルに供給されます
- テーブルには、約 100 の膨大な量のデータが格納されます。10,00,000 以上のレコード
- レポートクエリの構造は変更されません
- データは、カテゴリ、開始日、および終了日でフィルタリングされます (すべてオプションのパラメーターです)。
- 時間は関係ありません。日付部分のみです
定期的に実行されるスケジュールされたタスクを実行し、 からの値で新しいテーブルを更新することは良い考えでしょうMyTbl
か? 新しいテーブルは、レポート クエリのようになります。
Date | Category | Sent | Received | Blocked | Opened
このテーブルは、カテゴリと日付のフィルターを適用してクエリを実行します。
このアプローチの欠点:
- 私たちはまだ毎日データを維持する必要があります
- GROUP BY と SUM を適用する必要があります
- 元のアプローチよりも多くのデータベース操作が必要になる場合があります
- リアルタイムですべてのデータを取得できるわけではありません。
このアプローチの利点:
- データベースからのレコードのフェッチを高速化して、表示、並べ替え、およびページングのプロセスを高速化できます
これは実行可能なアプローチですか?プロセスをスピードアップする他の方法はありますか? 助けてください!