将60m记录导入SQL的最快方法是什么?

时间:2010-05-25 09:05:57

标签: c# .net sql-server bulkinsert bcp

我的数据库中有5-6个表,我需要填充测试数据以在我的应用中测试peroformance。

我可以编写代码并进行批量插入我的预测是运行将需要将近3天,所以我认为必须有更快的方法。

有什么想法吗?

6 个答案:

答案 0 :(得分:3)

根据您生成数据的方式,SSIS可能是插入数据的最佳方式。

另外,请确保尽可能关闭所有触发器并删除尽可能多的索引,然后重新添加它们。

答案 1 :(得分:1)

SSIS是一种方法,但您要么使用批量插入任务,要么循环遍历文件并调用INSERT INTO语句。有BCP可用。

答案 2 :(得分:1)

BCP速度非常快,而且使用起来并不困难,之后您也可以通过批处理文件简单快速地运行它。

SSIS,超级,您可以使用分支和决策树构建漂亮的脚本。

对于一次性情况,两者的速度都相似。

你会惊讶于它可以处理6000万的事实。如果有一个整洁的BCP批处理文件,你可以导入, - 我们sql然后修改,导出新数据,并创建不同的测试数据集。一切都会在几秒钟或几分钟内完成。

还要记住,如果需要为bcp指定格式文件,一种方法是将两个记录键入表中,然后从该表导出bcp,允许bcp生成fmt文件。现在您有了该文件,您可以使用它进行导入。

祝你好运,

马克布林 爱尔兰 BMW R80GS 1987

答案 3 :(得分:1)

通过预先禁用索引并在完成时重新启用它们,可以在插入大量数据时节省大量时间。在添加每一行时,它需要不断重新平衡索引,有时会拆分页面等。最好跳过一堆重复操作,并在插入完成后让它完成一次工作。

如果你是勇敢的并且你确定数据是正确的,你也可以杀死任何外键关系,并在完成后重新添加它们。否则,它将进行查找以检查插入的每行中每个FK值的有效性。其他约束也是如此。

答案 4 :(得分:0)

使用recursive CTEs一次生成并插入大量行:

with table1Test
as (
--
-- generate some test rows
--
)
insert into table1 select ... from table1Test

答案 5 :(得分:0)

你可以看看redgate工具,他们有一个叫做数据生成器。它可以帮助您编写自己的脚本,并且我确信它们已经以某种方式优化了插入速度。

(免责声明,我与redgate无关,就像软件一样)。