2010-10-20 121 views
3

我必须将大量数据插入到表中。 sqlserver 2008(与2005年相比)在这种情况下是否有增加性能的新功能?Sql server 2008 - 用于插入大量数据的性能调整功能

+0

“我要插入大量的数据放入表格中。“ - 也许你想解释你打算怎么做;有很多方法... – 2010-10-20 02:30:53

+0

我插入使用存储过程,其中我插入Select语句。 – Relativity 2010-10-20 02:58:23

回答

1

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

我对过去一个大项目,这需要进口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(); 
} 
} 
+0

你的意思是......呼吁SQL批量复制在一个循环中,并呼吁GC免费?如果是这样,我怎样才能指定批量复制的大小为1 GB。你有没有相同的示例代码? – Relativity 2010-10-20 04:07:53

+0

恐怕我从那时起就已经转移了工作,所以没有示例代码。就我而言,我使用了反复试验和一些有教育意义的猜测来做到这一点。 – Coxy 2010-10-20 05:28:10

+0

我已经添加了一些伪代码,这是我开发的应用程序的基本思想。 – Coxy 2010-10-20 05:37:15

4

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

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

+0

我不是通过代码来完成的。但它是否像SqlBulkCopy fatger比normar数据库插入?如果是这样,它有多快? – Relativity 2010-10-20 02:54:46

+0

检查数据加载性能指南http://bit.ly/9Due9T,SqlBulkCopy类本身http://bit.ly/8Xxu2R和高性能批量加载到SQL Server使用SqlBulkCopy http://bit.ly/a9KZ2l如果你仍然关注。但如果你使用TSQL然后去MERGE – 2010-10-20 08:26:59