Sql server Sql server 2008-用于插入大量数据的性能调整功能

Sql server Sql server 2008-用于插入大量数据的性能调整功能,sql-server,sql-server-2008,performance,Sql Server,Sql Server 2008,Performance,我必须在表中插入大量数据。SQLServer2008(与2005年相比)是否有任何新功能可以提高这种情况下的性能?SQLServer2008包含TSQL语句,可以加快某些类型的组合插入、更新和删除操作 如果您打算通过代码执行,我建议使用该类(但也存在于SQL Server 2005中)。我不知道这对您的问题是否可行,但如果可以,我会尝试在代码中开发该类 在过去的一个大型项目中,我有一个类似的问题,需要将15年的生产数据导入到一个新的模式中(在SQLServer2005中) System.Data

我必须在表中插入大量数据。SQLServer2008(与2005年相比)是否有任何新功能可以提高这种情况下的性能?

SQLServer2008包含TSQL语句,可以加快某些类型的组合插入、更新和删除操作


如果您打算通过代码执行,我建议使用该类(但也存在于SQL Server 2005中)。

我不知道这对您的问题是否可行,但如果可以,我会尝试在代码中开发该类

在过去的一个大型项目中,我有一个类似的问题,需要将15年的生产数据导入到一个新的模式中(在SQLServer2005中) System.Data.SqlClient.SqlBulkCopy是迄今为止最快的选项

如果您这样做,我建议您一次执行大约1GB的大量插入,然后手动调用.NETGC以释放内存中的表。我被迫做这两件事,以免出现内存错误(不过是32位系统)

编辑-我的解决方案的伪代码类似于:

Table dataToInsert = new Table();
var sqlCommand = new SqlCommand("select * from old database");
DataReader dataFromOldSystem = sqlCommand.ExecuteReader();
foreach (DataRow oldRow in dataFromOldSystem.Tables[0])
{
// I had to modify/transpose the row from the old table in some way
DataRow newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(2));
dataToInsert.AddRow(newRow);

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(3));
dataToInsert.AddRow(newRow);

newRow = new DataRow(oldRow.GetInt(0), oldRow.GetDateTime(1), oldRow.GetInt(4));
dataToInsert.AddRow(newRow);

// check if the number of rows is over some magic number that is below the memory limit
// you can check the private bytes in use by your app to help guess this number
if (dataToInsert.Rows.Count > 1000000)
{
SqlBulkCopy bulkCopier = new BulkCopy(blah);
bulkCopier.Execute();

dataToInsert = null;
GC.Finalize();
GC.Free;

dataToInsert = new Table();
}
}

“我必须在一个表中插入大量数据。”-也许你想解释一下你打算怎么做;有很多种方法…我使用一个存储过程来插入,在这个存储过程中我有insert Select语句。我不是通过代码来完成的。但它是否像SqlBulkCopy fatser而不是normar数据库插入???如果是这样,速度有多快???如果您仍然关心,请查看数据加载性能指南、SqlBulkCopy类本身以及使用SqlBulkCopy将高性能大容量加载到SQL Server。但是如果你使用TSQL,那么你的意思是..在循环中调用SQL大容量复制并调用GC释放?如果是,如何将大容量复制的大小指定为1 GB。你有相同的示例代码吗?恐怕从那以后我已经转移了工作,所以没有示例代码。在我的例子中,我使用了反复试验和一些有根据的猜测。我添加了一些伪代码,这是我开发的应用程序背后的基本思想。@Coxy“我被迫做这两件事,以避免出现内存错误(尽管是32位系统)。”如果你不使用DataTables代替IDataReader,你就不会遇到这些内存问题。