2008-09-26 53 views
4

我即将开始编写windows窗体应用程序,该程序将打开一个管道分隔且大小约为230 mb的txt文件。这个应用程序然后将这个数据插入到一个SQL Server 2005数据库(显然这需要迅速发生)。我为这个项目使用c#3.0和.net 3.5。从平面文件中插入数百万条记录到SQL Server中有哪些缺陷?

我不是要求应用程序,只是在这里一些共同的建议和潜在的陷阱建议。从我收集的网站中可以得知,SQL大容量复制是一个先决条件,有什么我应该考虑的(我认为只需用表单应用程序打开txt文件将是一个很大的努力;也许将其分解为blob数据?)。

谢谢,如果有人需要,我会编辑清晰的问题。

回答

16

你是否必须编写一个winforms应用程序?使用SSIS可能会更容易,更快速。有一些内置任务可用,尤其是Bulk Insert task

此外,值得一试Flat File Bulk Import methods speed comparison in SQL Server 2005.

更新:如果你是新来的SSIS,看看这些网站让你的快车道。 1)SSIS Control Flow Basics 2)Getting Started with SQL Server Integration Services

这是另一个如何:在importing Excel file into SQL 2005

+0

在SSIS中更容易和更快......同意。 – EvilSyn 2008-09-26 20:00:54

+0

我发现SSIS是一个巨大的痛苦在守护者。它更频繁地针对奇怪的重复,需要DBA访问数据库服务器以排除故障/修复/重新运行(这在我们的生产环境中受到限制)。 – 2008-09-26 20:04:03

1

这将是一个流式的努力。

如果可以,请勿在此处使用交易。交易成本太高了。

所以你要做的是一次读取一行文件并一次插入一行。您应该将失败的插入转储到另一个文件中,稍后您可以诊断并查看失败的位置。

起初,我会继续尝试插入几百行的数据,以确保流式传输工作正常,然后您可以打开所有您想要的内容。

1

您可以尝试使用SqlBulkCopy。它可以让你从“任何数据源”拉。

0

如果文件的列格式与数据需要结束的目标表格匹配,我宁愿使用命令行实用程序bcp加载数据文件。它非常快速,您可以指定错误文件以查找任何未能插入的“奇怪”记录。

如果您需要为其存储命令行参数(服务器,数据库,用户名/密码或可信连接,表,错误文件等),您的应用可以启动该命令。

我喜欢这种方法比运行BULK INSERT SQL命令更好,因为数据文件不需要位于数据库服务器可访问的系统上。要使用批量插入,您必须指定要加载的数据文件的路径,因此它必须是系统用户在运行加载的数据库服务器上可见和可读的路径。通常对我来说太麻烦了。 :-)

1

正如旁注所示,删除表的索引并在批量插入操作后重新创建它们有时会更快。

0

你谈论的数据量实际上并不那么庞大。我不知道你的效率问题是什么,但是如果你可以等待几个小时让它插入,你可能会惊讶于用一种真正天真的技术来完成每一行的每一行。一次将几千行左右的数据集合在一起,并将它们提交给SQL服务器可能会使其更快一些。

只是一个建议,可以为您节省一些严重的编程时间,如果你不需要它可以想象得那么快。取决于导入的运行频率,节省几天的编程时间可能很容易,因此可以在运行时等待几个小时。

0

您可以使用SSIS读取&插入,但将其作为您的WinForms应用程序中的包调用。然后你可以传入诸如源,目标,连接字符串等参数/配置。

方法文档:http://msdn.microsoft.com/en-us/library/aa337077.aspx

您可以设置转换和错误内SSIS处理和逻辑分支基于输入参数甚至创造。

1

您可能会考虑从完全恢复切换到批量记录。这将有助于保持备份的合理大小。

1

我完全推荐SSIS,你可以读取数百万条记录并在相对较少的时间内清理它们。

您将需要留出一些时间来掌握SSIS,但它应该得到回报。这里有上这么几个其他线程这将可能是有用的:

What's the fastest way to bulk insert a lot of data in SQL Server (C# client)

What are the recommended learning material for SSIS?

您也可以从C#程序包。我有一个C#程序,它从遗留系统读取3GL“主文件”(使用我为相关项目提供的API解析对象模型),获取包模板并修改它以生成ETL包。

相关问题