【问题标题】:Big Csv file into DB大 CSV 文件到数据库
【发布时间】:2016-06-23 06:55:49
【问题描述】:

我的 CSV 文件大小为 4gb,我需要将其导入 SQL Server。 我认为它有超过 2000 万行。如果有人能在不到一个小时的时间内为我提供一种方法,我将非常感激。

我已经在做的事情:

using (FileStream filestream = new FileStream(path, FileMode.Open, FileAccess.Read)) {
        using (StreamReader reader = new StreamReader(filestream, Encoding.UTF8)) {

            string line = "";
            bool isHeader = true;
            int counter = 0;

            while ((line = reader.ReadLine()) != null) {

                if (isHeader) {
                    model.Columns = line.Split(new string[] { "\t" }, StringSplitOptions.RemoveEmptyEntries);
                    isHeader = false;
                    continue;
                } else {

                    if (Settings.Default.RonudSet != 0) {
                         LoadInDB(indicator,RoundDecimals(line));
                    } else {
                        LoadInDB(indicator, line);  
                    }
                }
                cmd.ExecuteNonQuery();
                counter++;
            }
 }
            model.RowCount = counter;
            model.ColumnsCount = model.Columns.Length;
        }
    }
    return model;
}

我的数据库上传方式:

public void LoadInDB(char indicator, string key) {

        using (SqlConnection conn = new SqlConnection(Settings.Default.DBconnection)) {

            conn.Open();
            try {

                SqlCommand cmd = new SqlCommand("dbo.LipperFilesTestingInsertFileRowKey", conn);

                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.Add(new SqlParameter("@FileRowKey", SqlDbType.NVarChar, 100));
                cmd.Parameters["@FileRowKey"].Value = key;

                cmd.Parameters.Add(new SqlParameter("@targetTableIndicator", SqlDbType.NVarChar, 100));
                cmd.Parameters["@targetTableIndicator"].Value = indicator;

                cmd.ExecuteNonQuery();

            } catch (SqlException sqlExc) {

                MyLog.WriteToLog(sqlExc.Message,MyLog.Messages.Error);
            }
        }
    }

【问题讨论】:

    标签: c# sql-server csv upload insert


    【解决方案1】:
    1. 您不应该在每次插入行时都打开一个新连接。那会破坏你的表现。在开始读取文件之前打开连接并在最后关闭它。
    2. 使用事务。搜索SqlConnection.BeginTransaction。这将提高 DB 端的性能。如果没有事务,SQL Server 将提交每个插入,这是一种浪费。
    3. 考虑取消整个加载数据的方法,改用 SQL Server 的 BULK INSERT 功能。

    【讨论】:

    • 此外,还可以通过数据集和数据适配器上传数据。通常会减慢单个更新的是日志刷新的等待时间,您需要考虑到这一点。最简单的解决方案是简单地批量提交。例如。每 1000 次插入或每秒提交一次。这将填满日志页面,并将分摊日志刷新等待事务中所有插入的成本。与任何性能测试一样,请确保消除随机性,并预先分配数据库和日志,您不希望遇到数据库或日志增长事件。
    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2014-03-27
    相关资源
    最近更新 更多