提高SSIS包转储数据从Excel到SQL Server表的性能

我创build了一个将数据从Excel文件转储到SQL Server表的SSIS包。 该软件包只有2个任务:脚本组件任务和OLE DB目的地

打包2个任务将数据从xlsx文件转储到sql server表

请在下面find我在脚本任务中添加的代码:

/* Microsoft SQL Server Integration Services Script Component * Write scripts using Microsoft Visual C# 2008. * ScriptMain is the entry point class of the script.*/ using System; using System.Data; using Microsoft.SqlServer.Dts.Pipeline.Wrapper; using Microsoft.SqlServer.Dts.Runtime.Wrapper; using System.IO; using System.Data.OleDb; using System.Xml; [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain : UserComponent { private OleDbDataReader excelReader; private OleDbConnection excelConnection; private OleDbCommand excelCommand; DataTable tablesInFile; string currentTable; public override void PreExecute() { base.PreExecute(); GetDataFromExcelToReader(Variables.FilePath); } public override void PostExecute() { base.PostExecute(); excelReader.Close(); excelConnection.Close(); } //private void GetDataFromExcelToReader(string p_strFileName, string p_strTabName) private void GetDataFromExcelToReader(string p_strFileName) { string l_strConnectionString; if (File.Exists(p_strFileName)) { l_strConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + p_strFileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\";"; excelConnection = new OleDbConnection(l_strConnectionString); excelConnection.Open(); tablesInFile = excelConnection.GetSchema("Tables"); foreach (DataRow tableInFile in tablesInFile.Rows) { currentTable = tableInFile["TABLE_NAME"].ToString(); break; } excelCommand = excelConnection.CreateCommand(); //excelCommand.CommandText = "SELECT * FROM [" + p_strTabName + "A1:AX1048576]"; excelCommand.CommandText = "SELECT * FROM [" + currentTable + "]"; excelCommand.CommandType = CommandType.Text; excelReader = excelCommand.ExecuteReader(); } } public override void CreateNewOutputRows() { int counter = 0; while (excelReader.Read()) { Output0Buffer.AddRow(); Output0Buffer.Source = Variables.Source.ToString(); Output0Buffer.Column = excelReader.FieldCount > 0 ? excelReader[0].ToString() : null; Output0Buffer.Column1 = excelReader.FieldCount > 1 ? excelReader[1].ToString() : null; Output0Buffer.Column2 = excelReader.FieldCount > 2 ? excelReader[2].ToString() : null; Output0Buffer.Column3 = excelReader.FieldCount > 3 ? excelReader[3].ToString() : null; Output0Buffer.Column4 = excelReader.FieldCount > 4 ? excelReader[4].ToString() : null; Output0Buffer.Column5 = excelReader.FieldCount > 5 ? excelReader[5].ToString() : null; Output0Buffer.Column6 = excelReader.FieldCount > 6 ? excelReader[6].ToString() : null; Output0Buffer.Column7 = excelReader.FieldCount > 7 ? excelReader[7].ToString() : null; Output0Buffer.Column8 = excelReader.FieldCount > 8 ? excelReader[8].ToString() : null; Output0Buffer.Column9 = excelReader.FieldCount > 9 ? excelReader[9].ToString() : null; Output0Buffer.Column10 = excelReader.FieldCount > 10 ? excelReader[10].ToString() : null; Output0Buffer.Column11 = excelReader.FieldCount > 11 ? excelReader[11].ToString() : null; Output0Buffer.Column12 = excelReader.FieldCount > 12 ? excelReader[12].ToString() : null; Output0Buffer.Column13 = excelReader.FieldCount > 13 ? excelReader[13].ToString() : null; Output0Buffer.Column14 = excelReader.FieldCount > 14 ? excelReader[14].ToString() : null; Output0Buffer.Column15 = excelReader.FieldCount > 15 ? excelReader[15].ToString() : null; Output0Buffer.Column16 = excelReader.FieldCount > 16 ? excelReader[16].ToString() : null; Output0Buffer.Column17 = excelReader.FieldCount > 17 ? excelReader[17].ToString() : null; Output0Buffer.Column18 = excelReader.FieldCount > 18 ? excelReader[18].ToString() : null; Output0Buffer.Column19 = excelReader.FieldCount > 19 ? excelReader[19].ToString() : null; Output0Buffer.Column20 = excelReader.FieldCount > 20 ? excelReader[20].ToString() : null; Output0Buffer.Column21 = excelReader.FieldCount > 21 ? excelReader[21].ToString() : null; Output0Buffer.Column22 = excelReader.FieldCount > 22 ? excelReader[22].ToString() : null; Output0Buffer.Column23 = excelReader.FieldCount > 23 ? excelReader[23].ToString() : null; Output0Buffer.Column24 = excelReader.FieldCount > 24 ? excelReader[24].ToString() : null; Output0Buffer.Column25 = excelReader.FieldCount > 25 ? excelReader[25].ToString() : null; Output0Buffer.Column26 = excelReader.FieldCount > 26 ? excelReader[26].ToString() : null; Output0Buffer.Column27 = excelReader.FieldCount > 27 ? excelReader[27].ToString() : null; Output0Buffer.Column28 = excelReader.FieldCount > 28 ? excelReader[28].ToString() : null; Output0Buffer.Column29 = excelReader.FieldCount > 29 ? excelReader[29].ToString() : null; Output0Buffer.Column30 = excelReader.FieldCount > 30 ? excelReader[30].ToString() : null; Output0Buffer.Column31 = excelReader.FieldCount > 31 ? excelReader[31].ToString() : null; Output0Buffer.Column32 = excelReader.FieldCount > 32 ? excelReader[32].ToString() : null; Output0Buffer.Column33 = excelReader.FieldCount > 33 ? excelReader[33].ToString() : null; Output0Buffer.Column34 = excelReader.FieldCount > 34 ? excelReader[34].ToString() : null; Output0Buffer.Column35 = excelReader.FieldCount > 35 ? excelReader[35].ToString() : null; Output0Buffer.Column36 = excelReader.FieldCount > 36 ? excelReader[36].ToString() : null; Output0Buffer.Column37 = excelReader.FieldCount > 37 ? excelReader[37].ToString() : null; Output0Buffer.Column38 = excelReader.FieldCount > 38 ? excelReader[38].ToString() : null; Output0Buffer.Column39 = excelReader.FieldCount > 39 ? excelReader[39].ToString() : null; Output0Buffer.Column40 = excelReader.FieldCount > 40 ? excelReader[40].ToString() : null; Output0Buffer.Column41 = excelReader.FieldCount > 41 ? excelReader[41].ToString() : null; Output0Buffer.Column42 = excelReader.FieldCount > 42 ? excelReader[42].ToString() : null; Output0Buffer.Column43 = excelReader.FieldCount > 43 ? excelReader[43].ToString() : null; Output0Buffer.Column44 = excelReader.FieldCount > 44 ? excelReader[44].ToString() : null; Output0Buffer.Column45 = excelReader.FieldCount > 45 ? excelReader[45].ToString() : null; Output0Buffer.Column46 = excelReader.FieldCount > 46 ? excelReader[46].ToString() : null; Output0Buffer.Column47 = excelReader.FieldCount > 47 ? excelReader[47].ToString() : null; Output0Buffer.Column48 = excelReader.FieldCount > 48 ? excelReader[48].ToString() : null; Output0Buffer.Column49 = excelReader.FieldCount > 49 ? excelReader[49].ToString() : null; } } } 

请在OLE DB目标任务中完成下面的configuration快照:

OLE DB目标任务中的配置

目前如果我运行包含大约99000条logging的xlsx文件包,需要4分钟才能将数据转储到相当大的数据库中。 期望是在几秒钟内完成这个过程。 我怎样才能在这个包里面实现呢? 我的Excel文件是dynamic的,可以包含最less1条logging,最多1.5条logging。

请帮忙。 提前致谢!!

在OLE DB目标任务中进行更改服务于我的目的,我能够显着提高性能。

我通过调整它的一些属性来使用快速加载选项。 现在,我可以在15秒左右的时间内转储2laks的logging。

如果你正在寻找性能的angular度来看,那么我build议你使用以下内容:

1)在数据库中创build一个完全相同的临时表,该过程完成后将被删除或截断。

2)将excel源logging插入TEMP TABLE。

3)下一步,从TEMP TABLE获取logging并插入到目标表中。

注意:对于第一步,您可以拖动Execute SQL Task在存储过程或只是简单的查询