这里有一个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。
答案 0 :(得分:2)
查看SqlBulkCopy on MSDN或nice 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 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