ローカルのMSSQL Serverデータベースに、72列と800万を超えるレコードを持つテーブルがあります。 INT Identity列である主キーを除いて、ほとんどの列は浮動小数点数です。このテーブルには3つのインデックスもあります。
これらのレコードは、さまざまなターゲットオーディエンスで約1,000億の計算を処理した、私が作成したユーティリティから保存された出力です。将来の検索のために、各ターゲットオーディエンスの最良および最悪の結果を保存しました。これらすべてのレコードをステージングサーバーのデータベースに移動したいと思います。
これらのレコードをコピー転送するための最良の方法は何ですか?
Red Gateを試してみましたが、ディスク容量が足りなくなってしまいました。私のディスクには22GBの空き容量があります。ありがとう。
挿入を実行しているため、操作はログに記録された操作である可能性があります。
ログファイルの増加を監視すると、それが残りのディスク領域を利用していることがわかります。
最小限のログを記録したアプローチを使用して挿入することを検討してください。これには次のものが含まれます。
また、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仕様を適用し、シードを設定することを検討してください。
SQLの [〜#〜] bcp [〜#〜] ユーティリティは、このタスクの適切な候補です。 @Mark Storey-Smith answer をチェックして同様の問題を見つけてください。
また、抽出物のための十分なスペースがあることを確認してください。エクスポートとインポートを組み合わせてバッチファイルに入れ、単一のバッチプログラムを作成できます。
次のような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
これにより、ログファイルの過成長が防止されます