从平面文件向SQL Server插入数百万条记录的陷阱有哪些?
我将开始编写Windows窗体应用程序的旅程,该应用程序将打开以管道分隔且大小约为230 mb的txt文件。然后,此应用会将这些数据插入到sql server 2005数据库中(显然,这需要迅速进行)。我正在为此项目使用c3.0和.net 3.5.
我不是在要求该应用程序,只是在这里提供一些公共建议和潜在的陷阱建议。从我收集到的网站上得知,SQL大容量复制是一个准备工作,我有什么要考虑的(我认为仅使用Forms App打开txt文件将是一项巨大的工作;也许会将其分解为Blob数据?)。
谢谢,如果有人需要,我将编辑此问题以使其清晰。
解决方案
这将是流媒体的努力。
如果可以,请不要在此处使用交易。交易成本将太高。
因此,我们要做的就是一次读取一行文件,然后一次将其插入一行。我们应该将失败的插入内容转储到另一个文件中,以便以后进行诊断并查看失败的位置。
首先,我将尝试尝试几百行的大容量插入,以确保流媒体工作正常,然后我们可以打开所有想要的内容。
我们必须编写一个winforms应用程序吗?使用SSIS可能会更容易,更快捷。有一些内置任务,特别是批量插入任务。
另外,值得检查平面文件批量导入方法可以加快SQL Server 2005中的比较速度。
更新:如果我们不熟悉SSIS,请访问其中一些站点,以快速入门。 1)SSIS控制流基础知识2)SQL Server Integration Services入门
这是另一种方法:在将Excel文件导入SQL 2005中。
我们可以尝试使用SqlBulkCopy。它使我们可以从"任何数据源"中提取信息。
如果文件的列格式与需要结束数据的目标表匹配,则我更喜欢使用命令行实用程序bcp加载数据文件。它的速度非常快,我们可以为任何无法插入的"奇数"记录指定错误文件。
如果我们需要为其存储命令行参数(服务器,数据库,用户名/密码或者受信任的连接,表,错误文件等),则应用可以启动该命令。
与运行BULK INSERT SQL命令相比,我更喜欢这种方法,因为不需要数据文件位于数据库服务器可访问的系统上。要使用批量插入,我们必须指定要加载的数据文件的路径,因此该路径必须是运行加载的数据库服务器上的系统用户可见且可读的路径。通常对我来说太麻烦了。 :-)
顺便提一句,有时在批量插入操作之后删除表的索引并重新创建它们有时会更快。
我们正在谈论的数据大小实际上并不是那么大。我不知道效率问题是什么,但是如果我们能等待几个小时将其插入,那么我们可能会惊讶于一次只插入每行一次的真正幼稚的技术会多么容易实现。一次批处理大约一千行并将它们提交到SQL Server可能也会使它快很多。
如果我们不需要这样的建议,那么它可能会为我们节省大量的编程时间。根据此导入必须运行的频率而定,节省几天的编程时间很容易值得,因为它可以在运行时等待几个小时。
我们可以使用SSIS进行读取和插入,但可以从WinForms应用程序中将其作为软件包调用。然后,我们可以将诸如源,目标,连接字符串等内容作为参数/配置传入。
如何:http://msdn.microsoft.com/en-us/library/aa337077.aspx
我们可以在SSIS中设置转换和错误处理,甚至可以根据输入参数创建逻辑分支。
我们可能会考虑从完全恢复切换到大容量日志记录。这将有助于使备份保持合理的大小。
我完全推荐SSIS,我们可以读取数百万条记录,并在相对较短的时间内清理它们。
我们将需要花一些时间来熟悉SSIS,但它应该会有所回报。 SO上还有一些其他线程可能会有用:
在SQL Server(Cclient)中批量插入大量数据的最快方法是什么
推荐的SSIS学习材料是什么?
我们也可以从C#创建一个程序包。我有一个C程序,该程序从旧版系统中读取3GL"主文件"(使用我对相关项目使用的API解析为对象模型),并采用包模板并对其进行修改以生成ETL包。