2008-09-16 1 views
1

私は大量のデータを毎日、数十万のレコードをインポートするアプリケーションを持っています。
データはさまざまなソースから供給されています。データはC#を使用して読み取られ、データベースに一括して挿入されます。

このデータは、次いで、処理されます大量のデータストアドプロシージャやデータセットなどを管理していますか?

  • 異なるテーブルが
  • 新しいテーブルが
  • データが複雑algorithmnsを用いて補正された生成されたリンクされ
(特定のテーブルの合計がゼロに合計しなければなりません)

この処理のほとんどはストアドプロシージャで行われます。
複雑な処理の中にはC#で簡単なものもありますが、データセットをデータセットに抽出して再挿入すると処理が大幅に遅くなります。
データベースにデータを挿入する前にデータを処理しない理由を尋ねるかもしれませんが、メモリ内の100,000レコードを操作することは現実的ではないと考えています。

これはおそらく、ストアドプロシージャとその賛否両論を使用するという年齢の古い問題を引き起こすでしょう。 (例:単体テスト・ストアド・プロシージャはどのようにしますか?)

大量のデータを使用していて、問題にどのように取り組んできたかをお聞かせください。

答えて

1

私はSSISまたはDTSを使用します(あなたはMSSQLについて話していると仮定します)。彼らはその目的のために作られており、必要な場合はSPと協力します。

もう1つの方法は、Perlを使用してデータを前処理することです。それは奇妙な提案のように聞こえるが、実際にはこれらのシナリオでは非常に高速です。私はそれを過去に使用して、合理的な時間(数週間ではなく数日)で何十億ものレコードを処理しました。

「ユニットテストストアの手順」については、何か他のものと同様にMBUnitでユニットテストを行います。アドバイスのビットのみ:データのセットアップとロールバックが難しい場合がありますが、DTSトランザクションまたは明示的なSQL文を使用できます。

1

一般に、MSSQLでの作業についてはSkliwzに同意する必要があります。 SSISとDTSは道のりですが、あなたがそれらの技術に精通していない場合は、作業が面倒です。ただし、C#で処理を行い、データをSQL Server内に保存することもできます。

実際にC#で処理が簡単になると思うなら、SQL Server Projectを使ってdatabase objects using C#を作成してみてください。 SQL Serverの内部にあるCLRオブジェクトを使用すると非常に強力なことがたくさんあります。これにより、データベースに触れる前にコードを記述して単体テストできます。標準のユニットテストフレームワーク(NUnit、MSTest)のいずれかを使用してVS内でCLRコードを単体テストすることができます。管理が困難な一連のセットアップスクリプトとティアダウンスクリプトを書く必要はありません。

あなたのストアドプロシージャをテストする限り、私は正直言ってDBFitを探しています。あなたのデータベースは、それ以上テストされていない機能のブラックホールである必要はありません:)

0

ここで、データを処理する場所は、実行していることに大きく依存します。たとえば、データベースに入れたくないデータを破棄する必要がある場合は、そのデータをC#コードで処理します。ただし、データベース内で処理するデータは、一般的に「実装に依存しない」データである必要があります。したがって、他の人がJavaクライアントからデータを挿入したい場合、データベースは不良データを拒否できるはずです。そのロジックをC#コードに入れると、Javaコードはそれを知ることができません。

「データベースには別の言語を使用することは決してありません。たとえそれが本当であっても、DBAや開発者はまだデータベースを扱っており、ロジックがなければ間違いを犯すでしょう。あるいは、あなたの新しいC#開発者は、データを集めようとし、C#で書かれたデータプリプロセッサについて知りません(あるいは無視する)でしょう。

要するに、データベースに格納するロジックは、外部ソフトウェアに依存せずにデータが正しいことを保証するのに十分でなければなりません。

関連する問題