(ASP.NET)どのようにして、データベースの変更を追跡するリアルタイム・カウンタを作成するに行きますか?

StackOverflow https://stackoverflow.com/questions/1072067

質問

ここで問題です。

それはあなたが一日に走った「マイル」を追跡する上で、私が最近撮影したサイトで。したがって、ユーザーは、彼らは5マイルを走ったことを追加し、サイトにログインすることができます。これは、データベースに追加されます。

一日の終わりには、午前1時を中心に、すべてのマイルを計算サービスを実行すると、すべてのユーザーが一日中走ってApp_Dataににテキストファイルを出力します。そのテキストファイルは、ホーム・ページ上のフラッシュに表示されます。

私は、この種のばかげていると思います。私は、彼らが原因の大規模なパフォーマンスの問題にこれをしなければならなかったと言われました。彼らは前にそれをやってたり何の主要なパフォーマンスの問題だった正確にどのように私に教えてくれません。

だからみんなは何なアプローチを取るでしょうか?私の心に浮かん最初のものは、AJAX呼び出しを介してデータを取得するWebサービスでした。おそらく、新しい「マイル」のエントリが追加されるたびに、トリガーが起動し、「GlobalMiles」テーブルを更新されます。

私はこの上の任意の情報やヒントをいただければと思います。

本当にありがとうございました!

役に立ちましたか?

解決

私たちはあなたの要件のすべてを知っていないと何かが前に動作しませんでしたがため、

この質問に答えるのは少し難しいです。そこでここではいくつかの異なるアイデアがあります。

まず、あなたの仮定を再訪。あなたが必要とするすべての日次レポートの場合は一日一回、静的なレポートを生成すると、完全に有効なソリューションです。すべてのことが必要なのならば、なぜ、インスタンスのスナップショット(、ブログがデータベースから毎回エントリを提供するのではなく掲載された際にhtmlファイルを書き込むために使用されるブログのソフトウェアの多くある日throghoutデータベースを複数回ヒット - 多くはまだやります)最適化など。 「リアルタイム」機能を使用すると、追加している何かですか?

私はすぐにAJAXにジャンプしないでしょう。ただ、静的から動的にレポートを移動し、同じ入力方法を使用します。一度にあまりにも多くの操作を行うと、自分が埋もれための良い方法です。既存のコードを変更するとき、私は私がアプリケーションの残りの部分に影響の最小量WIH単独で変更できるエリアを探してみてください。あなたが動的なレポートを持っていたら、その後、あなたはAJAXを追加(およびプログレッシブを使用してくださいすることができますエンハンスメントで)。

ダイナミックレポート自体のためとして、あなたは、いくつかのオプションがあります。

もちろん、あなただけのSUMを選択することができます()が、各ユーザーが多数のエントリを持っている場合には、パフォーマンス上の問題を引き起こすように思えます。

お使いのデータベースがサポートしていれば、

、私はインデックス付きビューを使用して見ます(時々マテリアライズド・ビューと呼ばれます)。またサポートする必要がありますが、リアルタイムの和データに高速にアップデートすることができます:

CREATE VIEW vw_Miles WITH SCHEMABINDING AS 
SELECT SUM([Count]) AS TotalMiles, 
COUNT_BIG(*) AS [EntryCount],
UserId
FROM Miles
GROUP BY UserID
GO
CREATE UNIQUE CLUSTERED INDEX ix_Miles ON vw_Miles(UserId)
そのオーバーヘッドが多すぎる場合は、

は、@ jn29098のソリューションは、一度良いのです。スケジュールされたタスクを使用してそれをロールアップ。各ユーザのエントリが多い場合は、あなただけのタスクが実行された最後の時間からのデルタを追加することができます。

UPDATE GlobalMiles SET [TotalMiles] = [TotalMiles] + 
  (SELECT SUM([Count]) 
    FROM Miles 
    WHERE UserId = @id 
      AND EntryDate > @lastTaskRun
    GROUP BY UserId)
WHERE UserId = @id

あなたは、個々のエントリがありますが、その場で数を更新することができる唯一の合計を保存する気にしない場合:

UPDATE Miles SET [Count] = [Count] + @newCount WHERE UserId = @id

あなたは、エントリを追加し、両方の世界を持っているSPROCと一緒にこの方法を使用することができます。

最後に、あなたのトリガー方法は、同様に動作します。それはあなたが自動的にそれをやってSQLのテーブルinstadに更新を自分で行うインデックス付きビューに代わるものです。また、あなたはSPROCから出て、引き金に世界的なアップデートを動かす前のオプションに似ています。

エントリが削除されたときには、アプリケーションの機能ではありませんならば、あなたはそのことについて心配する必要はないかもしれないが、

最後の3つのオプションは、それがより困難な状況に対処するために行います。

今、あなたはあなたのデータベースに、リアルタイムデータをマテリア持っていることを今、あなたは、動的にレポートを生成することができます。そして、あなたはAJAXで空想を追加することができます。

他のヒント

彼らは本当にデータベース上の多くのヒット曲にによるパフォーマンスの問題を持っているなら、私はあなたがすべての入力を取得し、メッセージキュー(MSMQ)にそれを詰め込むことを示唆しています。その後、メッセージをピックアップし、データの一括挿入を行うもう一方の端のサービスを持つことができます。この方法は、あなたが少なく、DBのヒットを持っています。その後のことができます更新上のテキストファイルに出力しすぎています。

私は実行し、合計マイルを算出し、一回/時間または毎晩をロールアップしていますサマリー表を作成します。個々の要求のためには、最後のロールアップ計算とするとき、ユーザは、そのユーザの合計を取得するためにページを閲覧までの期間のために毎晩集計表と任意の追加のログに記録されたマイルから引くことができました。

どのように多くのユーザーあなたは一日あたりのレコードについて、どのように多くのログ話しているの?

scroll top