我有一个大的(~50Gb,~300毫升行)制表符分隔文件,我想将其导入到带有列char(10), varchar(512), nvarchar(512), nvarchar(512)
列的SQL Server表中。
使用T-SQL,SSIS或C#SqlBulkCopy类批量导入它需要一天时间。
有没有更快的方法来加载这些数据?
或者是否有某些条件会减慢它,我可以删除或更改?
答案 0 :(得分:2)
如果要插入现有表,请在导入之前删除所有索引,然后在导入后重新创建它们。
如果您使用的是SSIS,则可以调整批量和提交大小。
验证服务器上是否有足够的内存用于如此大的数据加载。
在本地服务器上执行加载操作(在本地复制文件,不要通过网络加载)。
将目标数据库和事务日志自动增长选项配置为合理的值,例如一次几百MB的块(对于主数据文件.mdf,默认值通常增长1MB)。增长操作缓慢/昂贵,因此您希望尽量减少这些。
确保您的数据和日志文件位于快速磁盘上,最好是在单独的LUN上。理想情况下,您希望将日志文件放在日志文件中的镜像单独LUN上(您可能需要与存储管理员或托管服务提供商联系以获取选项)。
答案 1 :(得分:2)
我在过去的几周里一直在与自己优化非常大的负载进行斗争。 BULK INSERT是我用BCP发现的最快的方式,而不是SSIS或TSQL Bulk Insert,但你可以做些什么来调整它。
答案 2 :(得分:0)
您是否尝试并行加载数据?这是一个简单的SSIS解决方案:
1)安装SSIS行号生成器(http://www.konesans.com/products/row-number-transformation.aspx) 2)创建一个SSIS包来读取文件。 3)在数据流任务中,读取源文件。 4)在数据流任务中,插入行号生成器。 5)在数据流任务中,使用行号插入条件拆分并创建多个线程(即rownumber%3 == 0,rownumber%3 == 1,rownumber%3 == 2)。 6)在数据流任务中,插入目标目标表。
希望这有帮助。