[英]reducing insert statement time when dealing with large amount of data
我读到有关SqlBulkCopy的信息,它可以减少插入大量行时所用时间的方式,我的情况是:我有一个excel文件,希望将其转换为dataTable,然后将此dataTable发送到存储过程(希望我无法更改其代码),将dataTable中的所有行插入数据库中的sql表
问题是我要插入1万到5万行,是否有什么办法可以减少存储过程所花费的时间?
最好的方法是使用SqlBulkCopy将数据添加到临时表中,然后将其提供给存储的proc。 您将需要编写一些SQL代码来进行处理,但是以这种方式执行所带来的性能好处应该值得付出。
如果创建一个新的存储过程,那么您将具有在数据库引擎内部运行所有这些代码的额外好处,因此您将不会在应用程序和数据库引擎之间来回切换。
一些代码:
var importData = new DataSet();
xmlData.Position = 0;
importData.ReadXml(xmlData);
using (var connection = new SqlConnection(myConnectionString))
{
connection.Open();
using (var trans = connection.BeginTransaction())
{
using (var sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, trans) { DestinationTableName = myTableName })
{
foreach (DataColumn col in importData.Tables[0].Columns)
{
sbc.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
sbc.WriteToServer(importData.Tables[0]); //table 0 is the main table in this dataset
// Now lets call the stored proc.
var cmd = new SqlCommand("ProcessDataImport", connection)
{
CommandType = CommandType.StoredProcedure
};
cmd.CommandTimeout = 1200;
cmd.ExecuteNonQuery();
trans.Commit();
}
connection.Close();
return null;
}
}
其中XmlData是具有与批量导入匹配的Xml数据的流,而myTableName包含要导入到的表。 记住,进行批量复制时,列名必须匹配100%。 案例也很重要。
该过程看起来像这样:
CREATE PROCEDURE [ProcessDataImport]
AS
BEGIN
DECLARE @IMPORTCOL INT
WHILE EXISTS (SELECT X FROM TEMPTABLE)
BEGIN
SELECT @IMPORTCOL = (SELECT TOP 1 COLUMN1 FROM TEMPTABLE)
EXEC DOTHEIMPORT @IMPORTCOL
DELETE FROM TEMPTABLE WHERE COLUMN1 = @IMPORTCOL
END
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.