1

SQL Server コミット挿入をチャンクにするにはどうすればよいですか? 古いデータベースから新しいテーブルに大量の行をコピーする必要がありますが、いくつかの問題があります。

  1. 完了するまでに時間がかかり、トランザクション全体が完了するまでテーブルに行が表示されません。

  2. 私のログファイルは狂ったように大きくなっており、おそらくスペースが不足するでしょう.

  3. 途中で何かが壊れたら、すべてを繰り返さなければなりません。

を追加するSET ROWCOUNT 500と、行数を制限できますが、最後に挿入された ID を続行する方法がわかりません。新しいテーブルにクエリを実行して、最後に挿入されたものを確認することもできますが、それが正しいことかどうかはわかりません。whereまた、私の句では列を使用していないため、少し難しく、ID続行する場所を正確に知る方法がわかりません。

これに対する最善のアプローチは何ですか?「forループ」または時々コミットできるものはありますか?

SQL Server 2008 R2 に SSMS を使用しています。

4

2 に答える 2

2

TomTom の回答は皮肉なものですが、2 つの基本的なオプションが含まれているため、役立つ場合があります。

  1. T-SQL でループを記述し (たとえばwhile を参照)、TOP と OFFSET を使用してチャンクを選択できます (order by が必要です)。Microsoftに従って、ログを最小限に抑えることができます。そして、すべてをやり直さずに再起動することだけを心配している場合は、これで問題ありませんが、高速になるとは思いません.

  2. 選択内容をファイルにエクスポートし、一括挿入を使用して読み込むことができます。

ここ (一括インポート操作と一括エクスポート操作について)ここ (INSERT セクションのベスト プラクティス)にいくつかのオプションがあります。

于 2012-07-02T10:01:32.413 に答える
-4

SQL Server コミット挿入をチャンクにするにはどうすればよいですか?

それをチャンクに挿入するコードをプログラムするのは非常に簡単です。

1: はい、それがトランザクションのしくみです。

2: はい、それがトランザクションのしくみです。

3: はい、何だと思いますか - それがトランザクションの仕組みです ;)

しかし、最後に挿入された ID を続行する方法がわかりません

いわゆるプログラミング。クライアント側で ID を生成します。最後に生成したものを覚えておいてください。

一般に、コードに INSERT を使用しないことをお勧めします。コードの動作によっては、これはデータ コピー操作のように聞こえますが、そのためのメカニズムは他にもあります (一括コピー インターフェイス)。

SQL Server 2008 R2 に SSMS を使用しています

基本的には、プログラムどおりに動作します。SSMS 側で簡単にループを挿入したり、ファイルにエクスポートしてから、ファイルを一括挿入したりできます。ただし、アイテム2については役に立ちません...単純なバックアップモデルに行き、復元を気にしない場合を除きます。

また、3 は複雑です。どうすれば適切に再起動できますか? 追加のコードがたくさん。

最善のアプローチは状況によって異なります。残念ながら、あいまいすぎて盲目的に推測することはできません。

于 2012-07-02T08:47:28.907 に答える