web-dev-qa-db-ja.com

巨大なテーブルデータをSQL Serverの別のテーブルにコピーする方法

340万行のテーブルがあります。このデータ全体を別のテーブルにコピーしたい。

私は以下のクエリを使用してこのタスクを実行しています:

select * 
into new_items 
from productDB.dbo.items

このタスクを実行するための最良の方法を知る必要があります。

29
sqlchild

newテーブルにコピーする場合、おそらく最も迅速な方法は、あなたの質問にあるものですnless行が非常に大きい場合です。

行が非常に大きい場合は、SQL Serverの一括挿入機能を使用することをお勧めします。 C#から呼び出すことができると思います。

または、最初にそのデータをテキストファイルにダウンロードしてから、一括コピー(bcp)することができます。これには、キー、インデックスなどを無視できるという追加の利点があります。

SQL Management Studioに付属のインポート/エクスポートユーティリティも試してください。ストレートバルクコピーと同じくらい高速かどうかはわかりませんが、フラットファイルとして書き出す中間ステップをスキップし、テーブルからテーブルに直接コピーすることができます。きみの SELECT INTOステートメント。

15
Stephen Chung

20億行のテーブルがあることを除いて、同じ問題がありました。そのため、リカバリモデルをBulk-Loggingに設定した場合でも、ログファイルが無限に大きくなります。

insert into newtable select * from oldtable

したがって、データのブロックを操作します。このように、転送が中断された場合、単に再起動します。また、テーブルほどのログファイルは必要ありません。また、tempdbのI/Oが少なくなるようです。理由はわかりません。

set identity_insert newtable on
DECLARE @StartID bigint, @LastID bigint, @EndID bigint
select @StartID = isNull(max(id),0) + 1
from newtable

select @LastID = max(ID)
from oldtable

while @StartID < @LastID
begin
    set @EndID = @StartID + 1000000

    insert into newtable (FIELDS,GO,HERE)
    select FIELDS,GO,HERE from oldtable (NOLOCK)
    where id BETWEEN @StartID AND @EndId

    set @StartID = @EndID + 1
end
set identity_insert newtable off
go

IDの処理方法を変更する必要がある場合があります。これは、テーブルがIDでクラスター化されている場合に最適です。

71
Mathieu Longtin

DBAと協力して、240M行の監査テーブルを別のデータベースにコピーしています。

単純な選択/挿入を使用すると、巨大なtempdbファイルが作成されました。

インポート/エクスポートウィザードの使用は機能しましたが、10分で800万行をコピーしました

カスタムSSISパッケージを作成し、設定を調整して10Minの30M行をコピーしました

SSISパッケージは、私たちの目的にとって最も速く、最も効率的であることが判明しました

伯爵

11
earlxtr

大きなテーブルを転送する別の方法を次に示します。これを使用して、2つのサーバー間で1億500万行を転送しました。かなり速い。

  1. データベースを右クリックして、Tasks/Export Dataを選択します。
  2. ウィザードで手順を実行しますが、データソースおよびターゲットとしてSQLサーバークライアントを選択すると、転送するデータベースとテーブルを選択できます。

詳細については、 https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/ を参照してください

5
user489998

1回限りのインポートの場合、SSMSのインポート/エクスポートユーティリティはおそらく最も簡単かつ高速に動作します。 SSISは、大規模なデータセットをインポートする場合、単純なINSERTよりも適切に機能するようです。

BULK INSERTまたはBCPを使用して、大きなレコードセットをインポートすることもできます。

別のオプションは、インポートするテーブルのすべてのインデックスと制約を一時的に削除し、インポートプロセスが完了したらそれらを追加し直すことです。これらの場合、以前は失敗したストレートINSERTが機能する場合があります。

あるデータベースから別のデータベースに直接移動するときにタイムアウトまたはロック/ブロックの問題を処理している場合、1つのデータベースからTEMPDBに移動し、次にTEMPDBから他のデータベースに移動して、いずれかの側。 TempDBはソースをブロックまたはロックせず、宛先を保持しません。

これらは試すべきいくつかのオプションです。

-エリックアイザックス

3
Eric Isaacs

単純な挿入/選択spは、行数が1 milを超えるまでうまく機能します。 20 mil +行を挿入/選択しようとすると、tempdbファイルが爆発するのを見てきました。最も簡単な解決策は、SSISでバッチ行サイズバッファーを5000に、コミットサイズバッファーを1000に設定することです。

1
user10198537

アーカイブ(DW)に焦点を合わせ、100以上のパーティションテーブルでVLDBを扱っている場合、これらのリソース集中型作業のほとんどを非運用サーバー(OLTP)で分離したい場合は、提案(OLTP-> DW)1)バックアップ/復元してデータをアーカイブサーバーに取得します(したがって、アーカイブまたはDWではステージデータベースとターゲットデータベースがあります)2)ステージデータベース:パーティションスイッチを使用して、対応するステージテーブルにデータを移動します
3)SSISを使用して、ステージングデータベースから両側の各ステージングテーブルのターゲットデータベースにデータを転送します。4)ターゲットデータベース:ターゲットデータベースのパーティションスイッチを使用して、ステージからベーステーブルにデータを移動します。

0
DB Bee