2009-04-09 12 views
0

私の会社は最近、64,000+行のデータを公平に定期的に更新する必要がありました。多くの行のデータをSQL Serverの異なる値で更新する最も速い方法

他の解決策がある場合は、私は他の人の参照のためにここに投稿していますが、フィードバックを見つけることもできます。

説明:各行には、更新されている固有の値があり、クライアント上で計算されるか、ユーザーによって手動で設定されます。

+0

あなたはさらに、彼らがどんな種類のアップデートを説明しているかを知ることができます - もしそれが乱数またはGUIDであれば、それは1つのステートメントで行うことができます! – Rad

+0

これらはランダム値ではなく、各行は特定の値を取得します。 –

答えて

1

これは、すべての行で同じ列が更新される必要があり、値が異なる場合にのみ有効です。

hh?

一括更新の仕組みはわかりませんが、新しい行にはすべての列に新しい値が含まれています。その場合は、各行を無条件で更新できます。あなたはもちろんの

update tablea a join bulkupdate b on (somekey) 
set a.col1 = coalesce(b.col1, a.col1), 
a.col2 = coalesce(b.col2, a.col2) 
etc. 

を行うことができ、その場合には

それとも唯一の非NULL列を更新する必要が、2つ目のシナリオでは、何の列はNULLに更新することはできないが、あなたはあなたの大部分を満たしている場合2番目の方法で列を更新すると、最初に、どのヌルが「データが実際にヌル」であり、「この列は更新されていない」ことを意味するのかわかりませんでした。

+0

合体のアイデアはとてもいいです。 –

1

解決策1(不良):64k更新ステートメントをテーブルに送信します。非常に遅いです。

解決方法2(悪い):SqlDataAdapterバッチ処理モードを使用して、サーバーへのラウンドトリップを減らします。より良いが、まだ非常に遅い。

解決策3a:新しいテーブル(または一時テーブル)を作成します。 SqlBulkCopyクラスを使用して、実表を更新するために必要なデータを含む新しい行を一時表に挿入します。 tempテーブルをループして更新を行うストアドプロシージャを実行します。

ソリューション3a:上記のように一括挿入を行いますが、実表と一時表を結合してフィールドの更新を行う単一の更新文を実行します。これは、すべての行が同じ列を更新する必要があるが、値が異なる場合にのみ有効です。

+0

更新するテーブルのPKがある場合は、ストアドプロシージャの代わりにUPDATEコマンドを実行するだけで、更新の複雑さを誤解している可能性があります。 –

関連する問題