2012-01-06 4 views
1

私が働いている問題のためのアイデアを必要としています。同期データベースは

csvファイルの一部の行は、データベース内の既存の行を参照して更新を必要とし、また一部は新しい行を参照して挿入を必要とします。

ファイルがたくさんあり(20個程度)、それぞれに行がある可能性があるので、どのようにスケーラブルにすることができますか?同じIDを持つ行が存在するかどうかを確認するためにデータベースに接続し(実際に更新または挿入されていることを確認するために)、実際の更新や挿入を行うために別の接続を作成するのは無駄に見えます。

+0

をBEGIN

ASソース

 CREATE PROCEDURE [dbo].[sp_Insert_XML] @XMLDATA xml 

としてXMLを使用してテーブルにデータを挿入するには?私はスケールについて話すときにあなたが時期尚早であるかどうかを判断しようとしています。 – Oded

+0

これを分割して一括して試してみると、既存のデータベースで一度に500行の行が検索されてしまいます。その後、それらをコードにマップし、更新/挿入を一緒に行います(同じ接続を再利用できない理由はありません)。このような多くのデータを扱うときには、失敗した場合、トランザクションは検討する価値があると考える価値があります – ChrisFletcher

+1

[SSIS](http://en.wikipedia.org/wiki/SQL_Server_Integration_Services)を読む必要がありますために。 – Oded

答えて

3
  1. 一時テーブルの負荷のすべて(一括挿入)

  2. は、ターゲット表にマージ更新を実行します。

+0

実行可能なアプローチ - シンプルかつ効率的! SQL側で制約がない場合(つまり、既存のスキーマを変更したり、余分なテーブルを処理したり、T-SQLを書くのに気をつけたりする必要はありません) –

+0

インデックスを追加する必要はありません。全体の処理時間が遅くなります。SQL Serverで入力をソートする必要がある場合、マージ元テーブルは一度だけ読み込まれるため、即座にソートできます。 – usr

+0

@usr:そうです。キーの参照は逆になるため、インデックスは必要ありません。私の答えからステップを削除しました。 – vstrien

2

である可能性があります。

SSISは、データ統合およびワークフローアプリケーション用のプラットフォームです。データの抽出、変換、ロード(ETL)に使用される高速で柔軟なデータウェアハウジングツールを備えています。

0

最良の方法は、我々は、フラットファイルのすべてのタイプのハンドルをCSVリーダー・コンポーネント(フラット・ファイル・ソース)を持つSSIS .IN SSISを使用するようになります(区切りパイプラインまたはタブを。など).Using検索uがしてチェックすることができますテーブル内の既存の行を削除してから、Oledbコンポーネントを使用して更新、挿入、または削除できます。

SSISを使用したくない場合は、XMLストアドプロシージャを使用して別の方法でラウンドが行われます。すべての行に対してデータベースを使用する代わりに、XMLとしてデータを渡してストアドプロシージャで操作できます。

例:私たちが話しているデータのどのような量

SET NOCOUNT ON; 
-- Insert statements for procedure here 
Insert into RCMReport(
    ProjectName 
    ,Category 
    ,EndTime) 
    Select 
     XMLDATA.item.value('@ProjectName[1]', 'varchar(255)') AS ProjectName, 
     XMLDATA.item.value('@Category[1]', 'varchar(200)') AS Category, 
     XMLDATA.item.value('@EndTime[1]', 'datetime') AS EndTime 
      FROM @XMLDATA.nodes('//RCMReport/InsertList') AS XMLDATA(item) 
関連する問題