340万行のテーブルがあります。このデータ全体を別のテーブルにコピーしたい。
私は以下のクエリを使用してこのタスクを実行しています:
select *
into new_items
from productDB.dbo.items
このタスクを実行するための最良の方法を知る必要があります。
newテーブルにコピーする場合、おそらく最も迅速な方法は、あなたの質問にあるものですnless行が非常に大きい場合です。
行が非常に大きい場合は、SQL Serverの一括挿入機能を使用することをお勧めします。 C#から呼び出すことができると思います。
または、最初にそのデータをテキストファイルにダウンロードしてから、一括コピー(bcp)することができます。これには、キー、インデックスなどを無視できるという追加の利点があります。
SQL Management Studioに付属のインポート/エクスポートユーティリティも試してください。ストレートバルクコピーと同じくらい高速かどうかはわかりませんが、フラットファイルとして書き出す中間ステップをスキップし、テーブルからテーブルに直接コピーすることができます。きみの SELECT INTO
ステートメント。
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でクラスター化されている場合に最適です。
DBAと協力して、240M行の監査テーブルを別のデータベースにコピーしています。
単純な選択/挿入を使用すると、巨大なtempdbファイルが作成されました。
インポート/エクスポートウィザードの使用は機能しましたが、10分で800万行をコピーしました
カスタムSSISパッケージを作成し、設定を調整して10Minの30M行をコピーしました
SSISパッケージは、私たちの目的にとって最も速く、最も効率的であることが判明しました
伯爵
大きなテーブルを転送する別の方法を次に示します。これを使用して、2つのサーバー間で1億500万行を転送しました。かなり速い。
詳細については、 https://www.mssqltips.com/sqlservertutorial/202/simple-way-to-export-data-from-sql-server/ を参照してください
1回限りのインポートの場合、SSMSのインポート/エクスポートユーティリティはおそらく最も簡単かつ高速に動作します。 SSISは、大規模なデータセットをインポートする場合、単純なINSERTよりも適切に機能するようです。
BULK INSERTまたはBCPを使用して、大きなレコードセットをインポートすることもできます。
別のオプションは、インポートするテーブルのすべてのインデックスと制約を一時的に削除し、インポートプロセスが完了したらそれらを追加し直すことです。これらの場合、以前は失敗したストレートINSERTが機能する場合があります。
あるデータベースから別のデータベースに直接移動するときにタイムアウトまたはロック/ブロックの問題を処理している場合、1つのデータベースからTEMPDBに移動し、次にTEMPDBから他のデータベースに移動して、いずれかの側。 TempDBはソースをブロックまたはロックせず、宛先を保持しません。
これらは試すべきいくつかのオプションです。
-エリックアイザックス
単純な挿入/選択spは、行数が1 milを超えるまでうまく機能します。 20 mil +行を挿入/選択しようとすると、tempdbファイルが爆発するのを見てきました。最も簡単な解決策は、SSISでバッチ行サイズバッファーを5000に、コミットサイズバッファーを1000に設定することです。
アーカイブ(DW)に焦点を合わせ、100以上のパーティションテーブルでVLDBを扱っている場合、これらのリソース集中型作業のほとんどを非運用サーバー(OLTP)で分離したい場合は、提案(OLTP-> DW)1)バックアップ/復元してデータをアーカイブサーバーに取得します(したがって、アーカイブまたはDWではステージデータベースとターゲットデータベースがあります)2)ステージデータベース:パーティションスイッチを使用して、対応するステージテーブルにデータを移動します
3)SSISを使用して、ステージングデータベースから両側の各ステージングテーブルのターゲットデータベースにデータを転送します。4)ターゲットデータベース:ターゲットデータベースのパーティションスイッチを使用して、ステージからベーステーブルにデータを移動します。