我有一个大的(~50Gb,~3 亿行)制表符分隔文件,我想将它导入到带有列的 SQL Server 表中:char(10), varchar(512), nvarchar(512), nvarchar(512)
.
使用 T-SQL、SSIS 或 C# SqlBulkCopy类批量导入它大约需要一天时间。
有没有更快的方法来加载这些数据?
或者是否有某种情况会减慢它的速度,我可以删除或更改?
我有一个大的(~50Gb,~3 亿行)制表符分隔文件,我想将它导入到带有列的 SQL Server 表中:char(10), varchar(512), nvarchar(512), nvarchar(512)
.
使用 T-SQL、SSIS 或 C# SqlBulkCopy类批量导入它大约需要一天时间。
有没有更快的方法来加载这些数据?
或者是否有某种情况会减慢它的速度,我可以删除或更改?
如果要插入现有表,请在导入前删除所有索引,并在导入后重新创建它们。
如果您使用的是 SSIS,则可以调整批处理和提交大小。
验证服务器上有足够的内存来处理如此大的数据负载。
在本地服务器上执行加载操作(将文件复制到本地,不要通过网络加载)。
将目标数据库和事务日志自动增长选项配置为合理的值,例如一次几百 MB 块(对于主数据文件 .mdf,默认值通常增长 1MB)。增长操作缓慢/昂贵,因此您希望尽量减少这些操作。
确保您的数据和日志文件位于快速磁盘上,最好位于单独的 LUN 上。理想情况下,您希望日志文件位于与日志文件不同的镜像 LUN 上(您可能需要与存储管理员或托管服务提供商联系以获取选项)。
在过去的几周里,我自己一直在努力优化一个非常大的负载。BULK INSERT 是最快的方法,我发现 BCP 与 SSIS 或 TSQL 批量插入相反,但是您可以做一些事情来调整它。
您是否尝试过并行加载数据?这是一个简单的 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) 在数据流任务中,插入目标目标表。
希望这可以帮助。