web-dev-qa-db-ja.com

800万件のレコードをコピーする

ローカルのMSSQL Serverデータベースに、72列と800万を超えるレコードを持つテーブルがあります。 INT Identity列である主キーを除いて、ほとんどの列は浮動小数点数です。このテーブルには3つのインデックスもあります。

これらのレコードは、さまざまなターゲットオーディエンスで約1,000億の計算を処理した、私が作成したユーティリティから保存された出力です。将来の検索のために、各ターゲットオーディエンスの最良および最悪の結果を保存しました。これらすべてのレコードをステージングサーバーのデータベースに移動したいと思います。

これらのレコードをコピー転送するための最良の方法は何ですか?

Red Gateを試してみましたが、ディスク容量が足りなくなってしまいました。私のディスクには22GBの空き容量があります。ありがとう。

4
Bobby Ortiz

挿入を実行しているため、操作はログに記録された操作である可能性があります。

ログファイルの増加を監視すると、それが残りのディスク領域を利用していることがわかります。

最小限のログを記録したアプローチを使用して挿入することを検討してください。これには次のものが含まれます。

  • バルク挿入
  • INSERT ... SELECT
  • トレースフラグ610とのマージ

また、IDを指定して列に挿入すると、ログが発生することもわかりました。

リンク: http://blogs.msdn.com//b/sqlserverstorageengine/archive/2008/02/05/bulk-logging-optimizations-minimal-logging.aspx http://www.sqlmag .com/article/tsql3/minimally-logged-inserts

また、ソースデータベースでデータが事前に並べ替えられていない限り、ヒープに挿入してからインデックスを適用することをお勧めします。

ソースデータベースでID値を定義し、すべてのデータを宛先に選択してから、ID仕様を適用し、シードを設定することを検討してください。

3
MEL

SQLの [〜#〜] bcp [〜#〜] ユーティリティは、このタスクの適切な候補です。 @Mark Storey-Smith answer をチェックして同様の問題を見つけてください。

また、抽出物のための十分なスペースがあることを確認してください。エクスポートとインポートを組み合わせてバッチファイルに入れ、単一のバッチプログラムを作成できます。

2
StanleyJohns

次のようなsmthを使用できます。

DECLARE @min int, @max int, @step int = 10000 --or any other batch size

SELECT @min = MIN(Id), @Max = max(id)
FROM YourTable

WHILE @min <= @Max
BEGIN
  INSERT YourStagingDB..StagingTable(columns)
  SELECT columnlist
  FROM YourTable
  WHERE Id >= @min AND Id < @min + @step

  SET @min = @min + @step 
END

これにより、ログファイルの過成長が防止されます

1
Oleg Dok