我在同一个数据库服务器上有两个名为DB1和DB2的数据库。我有DB2中的Table1和DB2中的Table2。目前,我正在使用插入select *来将表2中的所有数据转移到表1中(表1为空,我的目的是将表2中的数据复制到表1)。表结构是聚类ID列(GUID类型)和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 2009-08-28 03:09:35
是的,它提交每批作为一个单独的交易。 试试这个 http://blogs.msdn.com/sqlcat/archive/2009/02/12/the-data-loading-performance-guide-now-available-from-msdn.aspx 我认为对于大部分旧材料仍然有用。 – JasonHorner 2009-08-28 03:18:53
谢谢!真的很酷的文件。我会做更多的测试并在这里给你反馈。 :-) – George2 2009-08-28 03:38:55