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

7

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

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

有什么想法吗?


天啊,三天的SQL插入操作...你能想象如果你不得不通过文件上传(例如PhpMyAdmin、SQL-Web-Admin)通过Web界面来完成这个任务会是什么样子吗?祝你好运。 - Dalbir Singh
2
永远不要使用应用程序语言来完成数据库的工作,也不要让数据库承担应用程序语言的工作,因为这是数据库的工作。 - KM.
6个回答

3

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

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


1

SSIS是一种方法,但您将使用Bulk Insert任务或循环遍历文件并调用INSERT INTO语句。也可以使用BCP。


我正在考虑这个。BCP更快吗? - Jon
BCP并不比BULK INSERT更快。请参考此链接:http://msdn.microsoft.com/en-us/library/aa178096(SQL.80).aspx - Neil Knight
谢谢,奇怪的是我一直以为BCP更快。 - Jon
BCP 在提取数据方面要快得多。:o) - Neil Knight

1

BCP非常快速,使用起来也不是那么困难,而且你可以简单快速地从批处理文件中运行它。

SSIS超级强大,你可以构建带有分支和决策树的漂亮脚本。

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

你会惊讶于它如何快速地处理6000万。通过一个整洁的BCP批处理文件,你可以导入、使用SQL进行修改、导出新数据,并创建不同的测试数据集。所有这些都可以在几秒钟或几分钟内完成。

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

祝你好运,

马克·布林 爱尔兰 BMW R80GS 1987


1

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

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


0

使用递归CTE一次生成和插入大量行:

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

0
你可以看看Redgate的工具,他们有一个叫做数据生成器的工具。它可以帮助你避免编写自己的脚本,我相信他们已经对插入速度进行了优化。
(免责声明,我与Redgate无关,只是喜欢这个软件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接