将 CSV 导入 SQL 服务器 - 性能

本文关键字:性能 服务器 SQL CSV 导入 | 更新日期: 2023-09-27 18:20:35

我创建了一个小项目,它允许用户通过实体框架将CSV文件导入到SQL中。主过程如下所示:

using (TextFieldParser tx = new TextFieldParser(file, Encoding.UTF8))
        { 
            tx.TextFieldType = FieldType.Delimited;
            tx.SetDelimiters(";");
            tx.ReadLine(); //The First Line are the headers, no need
            while (!tx.EndOfData)
            {
                decimal decTmp;
                int intTmp;
                string[] fields = tx.ReadFields();
                //Convert every field to the appropriate type, tryparse if nullable
                ReportInfo("Verarbeite Nummer: " + fields[(int)ConnectionEvaluationFileField.PhoneNumber].Trim());
                Verbindunganalyse con = new Verbindunganalyse();
                con.Auswertungszeitraum = fields[(int)ConnectionEvaluationFileField.EvaluationTimeSpan].TrimStart('0');
                con.Betrag_inkl_MWST_CHF = Decimal.Parse(fields[(int)ConnectionEvaluationFileField.Cost]);
                if (decimal.TryParse(fields[(int)ConnectionEvaluationFileField.DataInMb], out decTmp))
                    con.Daten_MB = decTmp;
                con.Durchwahlnummer = Int64.Parse(fields[(int)ConnectionEvaluationFileField.PhoneNumber]);
                con.Produkteigenschaft = fields[(int)ConnectionEvaluationFileField.ProductProperty];
                if (Int32.TryParse(fields[(int)ConnectionEvaluationFileField.Messages], out intTmp))
                    con.SMS_MMS_Anzahl = intTmp;
                con.TelefonieDauer = TimeSpan.Parse(fields[(int)ConnectionEvaluationFileField.CallLength]);
                con.Untergruppe = fields[(int)ConnectionEvaluationFileField.SubGroup];
                if (Int32.TryParse(fields[(int)ConnectionEvaluationFileField.Connections], out intTmp))
                    con.Verbindungen_Anzahl = intTmp;
                container.Verbindunganalyse.Add(con);
            }
        }

它是德语,但我认为代码很清楚:我使用 TextFieldParser读取数据,创建一个新的 Entitiy 并将字段解析/签入属性。

问题:客户曾经有一个访问解决方案,需要 20-30 秒来导入数据,而使用我的解决方案,我需要 2-3 分钟来处理 2 个文件和 5k 数据集。

我找到了一些像 https://efbulkinsert.codeplex.com/这样的批量插入,但我们在这里谈论的是两个文件中的 10k 数据集。

我删除了报告信息等,但我看不到使这项工作更快的方法。你认为有可能用EF使这些东西更快吗?还是 TextFieldParser 非常慢,我需要在那里检查?

将 CSV 导入 SQL 服务器 - 性能

我知道

这是一个旧帖子,但我自己一直在尝试这个。我使用以下代码尝试了实体框架播种器 NuGet 包和裸机 SQL 批量插入;

CREATE TABLE [dbo].[TempTable] (
    [Field] type constraints,
    etc...
)
GO
BULK INSERT TempTable FROM 'filePath' WITH (
    FIRSTROW = 2,
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = ''r'n'
)
GO
INSERT INTO [FinalTable] SELECT [Fields] FROM [TempTable]
GO
DROP TABLE [TempTable]

播种机方法在 67 秒内插入 10,000 条记录,批量插入方法需要 223 毫秒。这真的是不费吹灰之力的。