我即将开始编写一个Windows窗体应用程序的旅程,该应用程序将打开一个管道分隔的txt文件,大小约为230 mb。然后,此应用程序将此数据插入到sql server 2005数据库中(显然这需要迅速发生)。我在这个项目中使用c#3.0和.net 3.5。
我不是要求应用程序,只是这里的一些公共建议和潜在的陷阱建议。从我收集的网站上我已经知道SQL批量复制是先决条件,我应该考虑一下(我认为只需用表格应用程序打开txt文件将是一项很大的努力;可能会将其分解为blob数据?)。 / p>
谢谢,如果有人需要,我会编辑问题以便清楚。
答案 0 :(得分: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。
答案 1 :(得分:1)
这将是一项流媒体努力。
如果可以,请不要在此处使用交易。交易成本太高了。
所以你要做的就是一次读取一行文件并一次插入一行。您应该将失败的插入转储到另一个文件中,以后可以诊断并查看它们失败的位置。
首先,我会继续尝试大量插入几百行,只是为了看到流媒体正常工作,然后你可以打开你想要的一切。
答案 2 :(得分:1)
您可以尝试使用SqlBulkCopy。它允许您从“任何数据源”中提取。
答案 3 :(得分:1)
正如旁注所示,删除表的索引并在批量插入操作后重新创建它们有时会更快。
答案 4 :(得分:1)
您可以考虑从完全恢复切换到批量记录。这有助于使备份保持合理的大小。
答案 5 :(得分:1)
我完全推荐SSIS,您可以在相对较短的时间内阅读数百万条记录并进行清理。
你需要留出一些时间来掌握SSIS,但它应该得到回报。在SO上还有一些其他线程可能会有用:
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的包。 / p>
答案 6 :(得分:0)
如果文件的列格式与数据需要结束的目标表匹配,我更喜欢使用命令行实用程序 bcp 来加载数据文件。它非常快,您可以为任何无法插入的“奇怪”记录指定错误文件。
如果您需要为其存储命令行参数(服务器,数据库,用户名/密码或可信连接,表,错误文件等),您的应用可以启动命令。
我比运行BULK INSERT SQL命令更喜欢这种方法,因为数据文件不需要位于数据库服务器可访问的系统上。要使用批量插入,必须指定要加载的数据文件的路径,因此它必须是运行负载的数据库服务器上的系统用户可见且可读的路径。通常对我来说太麻烦了。 : - )
答案 7 :(得分:0)
您所谈论的数据大小实际上并不是那么庞大。我不知道您的效率问题是什么,但是如果您可以等待几个小时来插入它,您可能会惊讶于使用一种非常天真的技术来实现它是多么容易,只需一次插入一行。一次批量处理大约一千行并将它们提交给SQL服务器也可以使它快得多。
如果您不需要它可以想象得那么快,那么这个建议可以为您节省一些严肃的编程时间。根据导入运行的频率,节省几天的编程时间可能很值得,以换取等待几个小时的运行。
答案 8 :(得分:0)
您可以使用SSIS进行阅读和阅读。插入,但从WinForms应用程序中将其称为包。然后你可以传递源,目标,连接字符串等内容作为参数/配置。
HowTo:http://msdn.microsoft.com/en-us/library/aa337077.aspx
您可以在SSIS中设置变换和错误处理,甚至可以根据输入参数创建逻辑分支。