同じデータベースサーバー上にDB1とDB2という2つのデータベースがあります。私はDB2のTable1とDB2のTable2を持っています。現在、select *にinsertを使用してTable2からTable1にすべてのデータを転送しています(Table1は空です。私の目的はTable2からTable1へのデータのコピーを作成することです)。テーブル構造は、(GUID型の)クラスタ化ID列とXMLバイナリ(varbinary)データ列です。SQL Serverの選択と挿入問題
私の現在の問題は、メモリ消費量が非常に高いことです。メモリ消費量を減らすための良いアイデアはありますか?私の大まかな考え方は、小さなトランザクションをいくつか初期化し、各トランザクションから部分的なデータを挿入することです。
VSTS 2008 + C#+ ADO.Net + SQL Server 2008 Enterpriseを使用しています。良いソリューションやリファレンスサンプルはありますか?
メモリ不足例外の原因となる現在のコードです。私はADO.Net SQLBulkCopy機能を使用しています。
namespace BulkCopyTable
{
public class CopyData
{
string _sourceConnectionString;
string _destinationConnectionString;
public CopyData(string sourceConnectionString,
string destinationConnectionString)
{
_sourceConnectionString =
sourceConnectionString;
_destinationConnectionString =
destinationConnectionString;
}
public void CopyTable(string table)
{
using (SqlConnection source =
new SqlConnection(_sourceConnectionString))
{
string sql = string.Format("SELECT * FROM [{0}]", table);
SqlCommand command = new SqlCommand(sql, source);
source.Open();
IDataReader dr = command.ExecuteReader();
using (SqlBulkCopy copy =
new SqlBulkCopy(_destinationConnectionString))
{
copy.DestinationTableName = table;
copy.WriteToServer(dr);
}
}
}
}
class Program
{
static void Main(string[] args)
{
CopyData copier = new CopyData(ConfigurationSettings.AppSettings["source"], ConfigurationSettings.AppSettings["destination"]);
Console.WriteLine("Begin Copy");
copier.CopyTable(ConfigurationSettings.AppSettings["Table"]);
Console.WriteLine("End Copy");
return;
}
}
}
ありがとうございましたJasonHorner、1.バルクバッチサイズをご確認します。私が1Mレコードを持っていて、バッチサイズを500Kに設定した後、最初の500Kバッチを挿入した後、SQL Serverは、最初から再起動以外の後半の500Kバッチを挿入することになります。 2.バルクロードのドキュメントは非常に素晴らしいです!しかし、それはSQL Server 2000、より新しいSQL Serverバージョンの関連ドキュメントです。 – George2
はいそれは、別々のトランザクションとして各バッチをコミットします。 これは http://blogs.msdn.com/sqlcat/archive/2009/02/12/the-data-loading-performance-guide-now-available-from-msdn.aspx 私は考えてみてくださいほとんどの場合、古い素材はまだ有効です。 – JasonHorner
ありがとう!本当にクールな文書。私はより多くのテストを行い、ここでフィードバックをします。 :-) – George2