将大规模CSV文件上载到SQL Server数据库

Mag*_*ndi 7 .net c# sql-server csv .net-2.0

我需要将大量(16GB,6500万条记录)CSV文件上传到SQL Server 2005数据库中的单个表.有没有人对最佳方法有任何指示?

细节

我目前正在使用C#控制台应用程序(.NET framework 2.0)将导入文件拆分为50000条记录的文件,然后处理每个文件.我使用SqlBulkCopy类将数据从控制台应用程序上传到数据库中,批量为5000.分割文件大约需要30分钟,上传整个数据集(6500万条记录)大约需要4.5小时.生成的文件大小和批量上载大小都是配置​​设置,我正在研究增加两者的值以提高性能.要运行该应用程序,我们使用具有16GB RAM的四核服务器.该服务器也是数据库服务器.

更新

鉴于到目前为止的答案,请注意在导入之前:

  • 截断数据库表,并删除所有索引和约束.
  • 数据库收缩,磁盘空间被回收.

导入完成后:

  • 索引将重新创建

如果您可以建议任何不同的方法,或者我们可以改进现有导入应用程序的方法,我将不胜感激.谢谢.

相关问题

以下问题可能对处理此问题的其他人有用:

我已经调查了改变批量大小和拆分文件大小的影响,发现500个记录的批次和200,000个记录的拆分文件最适合我的应用程序.使用SqlBulkCopyOptions.TableLock也有帮助.有关详细信息,请参阅此问题的答案.

我还研究了使用SSIS DTS包和BULK INSERTSQL脚本.SSIS包看起来更快,但没有让我能够记录无效记录等BULK INSERT.SQL脚本虽然比SSIS包慢,但比C#应用程序要快得多.它确实允许我记录错误等,因此,我接受BULK INSERT来自ConcernedOfTunbridgeWells的答案作为解决方案.我知道这可能不是面对这个问题的每个人的最佳答案,但它解决了我的直接问题.

感谢所有回复的人.

此致,MagicAndi

Con*_*lls 5

BULK INSERT从DBMS本身运行,从服务器上的目录中读取bcp控制文件描述的文件(或安装在其上).编写一个将文件拆分成较小块的应用程序,将它们放在适当的目录中执行一个执行一系列包装的包装器BULK INSERTS.如有必要,您可以并行运行多个线程.

这可能与批量负载一样快.此外,如果批量装入文件中有合适的分区键,请将登台表放在分区方案上.

此外,如果要批量加载到具有聚簇索引的表中,请确保数据的排序顺序与索引相同.合并排序是您的大型数据集的朋友.