Sql server 2008 - 用于插入大量数据的性能调整功能
我不知道这是否对您的问题是可行的,但如果你可以,我真的会尝试在代码中进行开发。
我对过去一个大项目,这需要进口15年值得生产数据到一个新的架构类似的问题(在SQL Server 2005) System.Data.SqlClient.SqlBulkCopy是目前为止最快的选择。
如果你这样做,我建议一次插入大约1GB的内容,然后手动调用.NET GC以释放内存中的表。我*做这些事情都不要碰到内存错误(32位系统,虽然)。
编辑 - 伪我solutiong是这样的:
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免费?如果是这样,我怎样才能指定批量复制的大小为1 GB。你有没有相同的示例代码? – Relativity 2010-10-20 04:07:53
恐怕我从那时起就已经转移了工作,所以没有示例代码。就我而言,我使用了反复试验和一些有教育意义的猜测来做到这一点。 – Coxy 2010-10-20 05:28:10
我已经添加了一些伪代码,这是我开发的应用程序的基本思想。 – Coxy 2010-10-20 05:37:15
SQL Server 2008包含MERGE TSQL语句,它可以加速某些类型的组合INSERT,UPDATE和DELETE操作。
如果你打算通过代码执行,我会建议使用System.Data.SqlClient.SqlBulkCopy类(但也出现在SQL Server 2005中)。
我不是通过代码来完成的。但它是否像SqlBulkCopy fatger比normar数据库插入?如果是这样,它有多快? – Relativity 2010-10-20 02:54:46
检查数据加载性能指南http://bit.ly/9Due9T,SqlBulkCopy类本身http://bit.ly/8Xxu2R和高性能批量加载到SQL Server使用SqlBulkCopy http://bit.ly/a9KZ2l如果你仍然关注。但如果你使用TSQL然后去MERGE – 2010-10-20 08:26:59
“我要插入大量的数据放入表格中。“ - 也许你想解释你打算怎么做;有很多方法... – 2010-10-20 02:30:53
我插入使用存储过程,其中我插入Select语句。 – Relativity 2010-10-20 02:58:23