のためのベスト-プラクティスの挿入/更新の大量なデータのSQL Server2008年
-
23-09-2019 - |
質問
私はビルシステム更新のため、大量のデータをCSVを配信します。通常であれば、私だけのループが各行の飼料、クエリを選択しチェックの場合、商品がすでに存在すると挿入/更新の項目によっては存在する場合又はいません。
私はこの方法はない拡張性とハンマーのサーバー上で配信します。私の値段が高くなりますが、ループを通じての事項は通常のもののけることもできます。その後100ない項目が選者100項目の一覧を取得し、既存の項目にデータベース。その後の連結は、insert/updateと走らせることをデータベースです。このことは本質的に削減を見るデータベースです。
このスケーラブルな解決とはありまえのチュートリアル、インポートで大切に生産す。
感謝
解決
こだまさにSQLサーバーを使2008年、このアプローチ:
- 第bulkcopyおCSVファイルを演出表
- 更新対象のテーブルから演テーブルの統合コマンド
チェックを MSDN docs や 大ブログ 使用法に関する統合コマンドです。
基本的には、当ウェブサイトへのリンクを間を実際のデータテーブルや、異なるテーブルを共通の基準など共通の主キー)を定義することができた時にどう
- 行試合では、例えば行できるという大きな利点ももって、ソースと対象のテーブル-->はんのいずれかを更新一部の分野でも無視では、なくてはならない
- 行からのソースファイルが存在しない対象者-->通常の場合、挿入
いて MERGE
決て思ったこと。
MERGE TargetTable AS t
USING SourceTable AS src
ON t.PrimaryKey = src.PrimaryKey
WHEN NOT MATCHED THEN
INSERT (list OF fields)
VALUES (list OF values)
WHEN MATCHED THEN
UPDATE
SET (list OF SET statements)
;
もちろん、 ON
項きく関与が必要です。もちろん、 WHEN
算も複雑なものとして、例えば
WHEN MATCHED AND (some other condition) THEN ......
います。
MERGE
とても迫力があり非常に有用な新コマンドSQL Server2008-利用すればできる!
他のヒント
あなたの方法は、最悪の可能な解決策です。一般的には、個別に、レコードをループの観点で考えるべきではありません。私たちは、(ループがレコードを、それが万人を超えるレコードを持つファイルをロードするために18〜20時間かかるだろうと同社建てインポートツールを持っている、それが構築された時に頻繁に発生しなかったものを使用するが、これは何度aは一日の発生になりました)。
私は2つのオプションを参照してください。 ステージングテーブルにロードする最初の使用一括挿入をし、そのテーブルの上に行う必要があるクリーンアップ何でもやります。レコードがすでに存在する場合はどのように決定されますか?あなたは更新を決定し、これらのフィールドにステージングテーブルに参加することにより、セットベースの更新を構築することができるはずです。多くの場合、私はそれがクエリを通じて、更新を行っていることと一致し、人口レコードのIDのための私のステージングテーブルにカラムを追加しました。その後、対応するIDをお持ちでない場合、レコードの挿入を行います。あなたが一度にすべてを行うには、あまりにも多くのレコードを持っている場合、あなたは(これはイエスがループである)バッチで実行されますが、一度に1つのレコードのよりかなり大きいバッチを加えることができます(私は通常に基づいて、その後2000年に開始し、私はバッチで、多かれ少なかれ行うことができれば、それはそのためにかかる時間)が決定します。
私は2008年にもMERGE文を持っていますが、私はまだそれを使用する機会を持っていなかったと思います。オンラインブックでそれを見ています。
の代替は、速度のために最適化されたSSISを使用することです。 SSISはかかわらず、複雑なものであると学習曲線が急勾配である。
は一つの方法は、あなたのDataTableにCSV(または可能性が高いDataReaderを)ロードされ、その後、SqlBulkCopyを使用した結果でバッチスラム -
http://msdn.microsoft.com /en-us/library/system.data.sqlclient.sqlbulkcopy.aspxする
そのかなり効率的で、あなたには、いくつかの列マッピングを行うことができます。ヒント - SqlBulkCopyを使用して列をマップするとき、彼らは大文字と小文字が区別されます。
。別のアプローチは、ファイル全体を操作するには、サーバー上のサーバーに、.NETストアド・プロシージャを記述することです...
あなたががクリス・クラウスのソリューションよりも多くの制御が必要な場合にのみ、- 私はシンプル(および再利用可能)、それを維持するの大ファンだところ我々はできる...
あなたはすべてでここにあなた自身をロールする必要がありますか?でしょうが、SQL Serverは、それをロードしてからインポートが完了すると、データベース内の重複に対処するための一括インポートを使用することができるような方法でデータを提供することが可能?
は、データの多くの重い物を持ち上げることになると私の経験を可能な限りデータベースで作業することは非常に速く、少ない資源集約的であることをする傾向がある。