SQL Server 2008 - 插入大量数据的性能优化功能

3

我需要向一个表中插入大量数据。相比于2005版本,SQL Server 2008是否有任何新功能能够提高性能?


我需要将大量数据插入到表中。也许您想解释一下您打算如何做到这一点;有很多方法可以实现... - Mitch Wheat
我正在使用存储过程进行插入操作,其中包含插入Select语句。 - Relativity
2个回答

4

SQL Server 2008包含MERGE TSQL语句,可以加速某些类型的组合INSERT、UPDATE和DELETE操作。

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


我并不是通过代码来完成的。但是SqlBulkCopy比普通的数据库插入更快吗?如果是,它有多快? - Relativity
请查看数据加载性能指南http://bit.ly/9Due9T,SqlBulkCopy类本身http://bit.ly/8Xxu2R以及使用SqlBulkCopy进行高性能批量加载到SQL Server的方法http://bit.ly/a9KZ2l,如果您仍然担心。但是,如果您使用TSQL,则可以使用MERGE。 - Nick Martyshchenko

1

我不知道这对你的问题是否可行,但如果可以的话,我真的建议你尝试用代码来开发。

我曾经有一个类似的问题,需要将15年的生产数据导入到新的模式中(在SQL Server 2005中)。System.Data.SqlClient.SqlBulkCopy是迄今为止最快的选项。

如果你选择这种方式,我建议你每次插入大约1 GB的数据,然后手动调用.NET GC来释放内存中的表。我被迫做这两件事情,以避免内存错误(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();
}
}

你的意思是..在一个循环中调用SQL批量复制并调用GC进行释放吗?如果是,我如何指定批量复制的大小为1GB。你有任何相同的示例代码吗? - Relativity
很抱歉,自那时起我已经换了工作,所以没有样本代码。在我的情况下,我使用试错和一些有根据的猜测来完成它。 - Coxy
我已经添加了一些伪代码,这是我开发的应用程序的基本思想。 - Coxy
@Coxy“我被迫这样做,以避免内存错误(32位系统,虽然)。如果您不使用 DataTables 而是使用 IDataReader,您就不会遇到这些内存问题。” - Elisabeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接