2016-04-01 7 views
2

データベースにログファイルを記録しようとしています。私の質問は、データベースにログを作成する負荷が少ないものです。私はインベントリプログラムのために、長期のログファイルを格納することを考えています。おそらく3〜5年です。ログ(.txtファイル)をアップロードすると、イベントごとに1つのレコードがデータベースに挿入されます。記録時の効率性ログ

処理:バーコードスキャナを使用します。 バーコードをスキャンした後、ログインした人の詳細、日付と時刻、製品の詳細が一枚ごとに保存されます。

私は2つのアイデアを思いついた。スキャンイベントの後

  1. 、それはバッチを終えた後、その後DataTableに保存されます。.. DataTable*.txtファイルに書き込まれ、私のデータベースにアップロードされます。
  2. スキャンしたすべてのバーコードの後に​​、INSERTクエリが実行されます。 私は、このサーバー

二つのオプションの長所と短所は何ですかを使用してだけではないですので、このオプションは、サーバー側で重いだろう疑いますか?
より効率的なログの保存方法はありますか?

+0

秒を使用します。実際にはデータベースを使用するのが正しい方法です - データをスキャンし、安全なACID準拠のストレージに保存してください。 –

+0

どの程度のデータ損失が許容されますか?許容可能なレイテンシのレベルは? (待ち時間=スキャンイベントとデータベースに表示されるログの間の時間)。キューを調べることをお勧めします。あなたのスキャナは個々のログイベントをキューに投げ込みます。データベースについては何も知らないので、 SQL Serverはキューから物を読み込みます。スキャナについては何も知りません。いずれかの側で何らかの種類のスループットの不一致がある場合、キューはそれを処理します。あなたのオプション1はスキャナ側に設定されたキューですが、私は中央のスタンドアロンキューについて話しています –

+0

@ Nick.McDermaid私が集めたものから、データ損失はありません。そこにいる。レイテンシについては、比較的短い時間(0.5ms〜2sec)でなければなりません。洞察をいただきありがとうございます。 – Hexxed

答えて

2

あなたのユースケースに基づいて、私はまた、あなたが、少なくとも2つの追加要因、最初はそれがスキャンしたアイテムがすぐにデータベースに記録されていることがいかに重要であるかというのを検討する必要があると思います。スキャンされたアイテムがスキャンされているかどうかをチェックするために、スキャンされたアイテムをログに記録する必要がある場合は、他のスキャンを防止するなど、単一のインサートを実行することはおそらく非常に良いアイデアです。次に考慮すべき点は、アイテムの「スキャンを解除する」必要がありますか、そしてプロセスのどの部分ですか?人のスキャンで直ちにスキャンを元に戻す必要がある場合は、すべてのスキャンが完了するまで待ってからデータをデータベースにダンプすることをお勧めします。これにより、テーブルから削除する必要がなくなります。

全体的に私はデータベースが扱うことができないほどの心配はありません.SQL Serverは、そのユースケース用に設計されたテーブルへの同時挿入を処理するのに非常に優れています。新しいデータをテーブルの末尾に挿入して既存のレコードを更新または削除しない場合は、パフォーマンスが大幅に向上します。大きなバッチインサートの場合も同じですが、その目的のためにテーブルが設計されていると仮定すると、何行を入れようとも非常に効率的です。

全体的には、特定のユースケースのアプリケーション側から効率的なソリューションを選択してから、それを決定したら疑わしいコードの周りにコードを作成しようとするのではなく、データベースの制限。

+0

ありがとうございます。しかし、それは私が心配しているデータベースの制限ではなく、サーバーが処理できるトラフィックの量..それはおそらく私の質問の今は外です。 – Hexxed

+1

@Hexxed 1つの要因かもしれませんが、例として、約180の異なるソースから2つのテーブル(メタデータの場合は27k、拡張データの場合は27k)に約54,000の挿入を取得するロギングデータベースを使用しています。良い。同じデータベースには設定データも格納され、約3000の同時読者が得られます。私たちは悪いコードのために数回ピークを迎えました。折れ点は、1分あたり約1.9mの差し渡しで、接続が足りなくなりました。それはかなりまともなハードウェア(512ギガバイトのRAM、デュアル3.7ghzのxeons、10ギガビットのネットワーク)で実行されますが、それはあなたに単一の挿入のスケールのアイデアを与える。 –

1

2つのオプションの賛否両論は何ですか?

基本的にはあなたの質問は、より効率的である方法である(一括挿入または複数の単一の挿入)?

答えは常にに依存し、常に状況に基づいています。だから、残念ながら、私はあなた

  1. ログテーブルを構築方法について答えはないと思います。
  2. 一括挿入を選択した場合、1回に何行挿入しますか?
  3. 読み取り専用テーブルですか?そして、あなたがそれから読むことを望むなら、あなたはどのくらい頻繁に読むのですか?
  4. スケールアップする必要がありますか?
  5. 等...

は、ログを格納するのがより効率的な方法はありますか?

私は考えることができる改善するためのいくつかの可能な方法は、あなたが最初のオプションで行けば、多分あなたはに挿入をスケジュールすることができ

  1. (それらのすべてではないが、一緒に働くことができる)があります非ピーク時間
  2. あなたが最初のオプション、チャンクログファイルを移動して、2番目のオプションと一緒に行く場合は、インサート
  3. は、ロギング
  4. を行うには、別のデータベースを使用しない場合は、行いますいくつかの負荷テスト

個人的には、プロジェクトが小規模から中規模でロギングがプロジェクトの重要な部分である場合、個人的には第2のオプションを選択することをお勧めします。

願っています。

+0

啓発に感謝します。このプロジェクトは企業レベルでは大規模です。はい、ログはチェック、進捗状況、効率レポートにとって重要です。 – Hexxed

1

2番目のオプションで、トランザクションを使用します。この方法では、トランザクションを完了するまでデータをdbに送信しません。 (スケジュールすることもできます)。これにより、クラッシュなどが発生した場合でも、データベースにデータが壊れるのを防ぐことができます。

Transactions in .net

Transaction Tutorial in C#

関連する問題