【问题标题】:Increase performance of SSIS Package dumping data from Excel to SQL Server table提高 SSIS 包将数据从 Excel 转储到 SQL Server 表的性能
【发布时间】:2014-03-11 14:45:19
【问题描述】:

我创建了一个 SSIS 包,它将数据从 Excel 文件转储到 SQL Server 表。该软件包仅具有 2 个任务: 脚本组件任务和 OLE DB 目标

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

/* 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 目标任务中完成的配置快照:

目前,如果我为包含大约 99000 条记录的 xlsx 文件运行包,则需要 4 分钟才能将数据转储到相当大的数据库中。期望在几秒钟内完成该过程。 我怎样才能在这个包中实现这一点。我的 Excel 文件是动态的,可以包含最少 1 条记录到最多 1.5 - 2 条 lacs 记录。

请帮忙。提前致谢!!

【问题讨论】:

    标签: sql sql-server excel ssis


    【解决方案1】:

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

    我通过调整几个属性来使用 Fast Load 选项。现在,我可以在大约 15 秒内转储 2laks 记录。

    【讨论】:

      【解决方案2】:

      如果您正在寻找性能的观点,那么我建议您使用以下方法:

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

      2) 将excel源中的记录插入到TEMP TABLE中。

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

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

      【讨论】:

      • 即使我创建了一个临时表,也只会增加整个过程的时间。首先,4 分钟将数据加载到临时表中,然后从临时表加载到我的目标表。如果我的理解在任何地方有误,请纠正我?
      • 你做了什么来加载临时表?能告诉我过程吗?
      • 我还没有创建任何临时表。我在数据库中有表。我在我的问题中定义了从我的excel文件中转储该表中的数据的整个过程。如果我需要提供更多信息,请给我打电话。
      • 那么你怎么能不试就知道。在存储过程中创建第一个进程,将数据传输到临时表,第二个是将数据从临时表加载到目标表。
      • 我认为这里有点混乱。我在脚本任务中进行这种编码的原因是因为我的 excel 源文件是动态的。我什至在我的问题中提到了这一点。脚本任务将数据提供给映射到 sql server 表列的输出列。我希望这可以解释整个情况。如果您能在脚本代码中提出一些建议或在 OLE DB 目标任务中进行一些配置更改,以帮助我们在目标表中更快地加载数据,我将不胜感激。
      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多