将数据从文本文件插入SQL服务器(速度?方法?)

时间:2012-03-06 06:54:41

标签: sql sql-server performance import flat-file

这里有一个400 MB的.txt文件,由'|'分隔。使用带有C#的Windows窗体,我将.txt文件的每一行插入到SQL服务器数据库的表中。

我正在做的只是这个(简称为“......”):

while ((line = file.ReadLine()) != null)
{
   string[] split = line.Split(new Char[] { '|' });

   SqlCommand cmd = new SqlCommand("INSERT INTO NEW_AnnualData VALUES (@YR1984, @YR1985, ..., @YR2012)", myconn);
   cmd.Parameters.AddWithValue("@YR1984", split[0]);
   cmd.Parameters.AddWithValue("@YR1985", split[1]);
   ...
   cmd.Parameters.AddWithValue("@YR2012", split[28]);

   cmd.ExecuteNonQuery();
}

现在,这是有效的,但需要一段时间。这是我第一次用大量数据做任何事情,所以我需要确保A)我这样做是有效率的,并且B)我的期望不是太高。

在循环播放时使用SELECT COUNT(),我可以看到数字随着时间的推移而上升。所以我用了一个时钟和一些基本的数学来计算出事情的速度。 在60秒内,有73881个插入。这是每秒1231次插入。问题是,这是一个平均速度,还是我的表现不佳?如果是后者,我该怎么做才能提高性能?

我确实读过一些关于SSIS的信息。但是,我需要通过单击Windows窗体中的按钮来实现此操作,而不是通过SISS。

4 个答案:

答案 0 :(得分:2)

查看SqlBulkCopy on MSDNnice blog post here。对我而言,每秒可达数万次插入。

答案 1 :(得分:2)

我不得不同意Andomar。我真的很喜欢SqlBulkCopy。它真的很快(您需要play around with BatchSizes以确保找到适合您情况的那个。)

有关讨论各种选项的真正深入的文章,请查看Microsoft的“数据加载性能指南”; http://msdn.microsoft.com/en-us/library/dd425070(v=sql.100).aspx

另外,请查看使用CSV Reader的SqlBulkCopy的C#示例。它不是免费的,但是如果你能在更短的时间内编写一个快速而准确的解析器,那就去吧。至少,它会给你一些想法。

答案 2 :(得分:2)

噢 - 这种方法会给你带来惊人的表现。尝试使用BULK INSERT,如下所示:

BULK INSERT MyTable
    FROM 'e:\orders\lineitem.tbl'
    WITH 
    (
        FIELDTERMINATOR ='|',
        ROWTERMINATOR ='\n'
    )

这是性能方面的最佳解决方案。存在一个缺点,即文件必须存在于数据库服务器上。如果您不从运行该进程的位置访问服务器的文件系统,那么我过去使用过两种解决方法。一种是在工作站上安装SQL Express实例,将主服务器作为链接服务器添加到工作站实例,然后运行“BULK INSERT MyServer.MyDatabase.dbo.MyTable ...”。另一种选择是将CSV文件重新格式化为XML,可以非常快速地处理,然后将XML传递给查询并使用OPENXML进行处理。 BULK INSERT和OPENXML都在MSDN上有很好的文档记录,你可以通过这些例子来阅读。

答案 3 :(得分:1)

我认为SSIS比这种类型的方法更快 ,但是有很多变量会影响性能。

如果要试验SSIS,请使用Management Studio中的“导入和导出”向导生成将导入管道分隔文件的SSIS包。您可以保存包并从.NET应用程序运行它

有关如何以编程方式运行SSIS包的信息,请参阅此文章:http://blogs.msdn.com/b/michen/archive/2007/03/22/running-ssis-package-programmatically.aspx。它包括如何从客户端,服务器或任何地方运行的选项。

另外,请查看本文,了解一般可以提高批量插入性能的其他方法。 http://msdn.microsoft.com/en-us/library/ms190421.aspx