我的数据库中有 5-6 个表,我需要用测试数据填充这些表以测试我的应用程序中的性能。
我可以编写代码并进行批量插入,我的预测是它需要将近 3 天才能运行,所以我认为必须有更快的方法。
有任何想法吗?
我的数据库中有 5-6 个表,我需要用测试数据填充这些表以测试我的应用程序中的性能。
我可以编写代码并进行批量插入,我的预测是它需要将近 3 天才能运行,所以我认为必须有更快的方法。
有任何想法吗?
根据您生成数据的方式,SSIS 可能是插入数据的最佳方式。
此外,请确保尽可能关闭所有触发器并删除尽可能多的索引,然后重新添加它们。
SSIS 是一种方法,但您要么使用批量插入任务,要么循环文件并调用 INSERT INTO 语句。有 BCP 可用。
BCP 非常非常快,而且使用起来并不难,之后您也可以从批处理文件中简单快速地运行它。
SSIS,超级棒,你可以用分支和决策树构建漂亮的脚本。
对于一次性情况,两者的速度将相似。
你会惊讶于它可以处理 6000 万的事实。使用简洁的 BCP 批处理文件,您可以导入 -us sql 然后修改、导出新数据,并创建不同的测试数据集。所有将在几秒钟或几分钟内工作。
还请记住,如果您需要为 bcp 指定格式文件,一种方法是在表中键入两条记录,然后从该表中导出 bcp,从而允许 bcp 生成 fmt 文件。现在您有了文件,您可以使用它进行导入。
祝你好运,
Mark Breen 爱尔兰 BMW R80GS 1987
通过预先禁用索引并在完成后重新启用它们,您可以在插入大量数据时节省大量时间。在添加每一行时,它需要不断地重新平衡索引,有时还需要拆分页面等。最好跳过一堆重复的操作,在插入完成后让它做一次工作。
如果你很勇敢并且确信数据是正确的,你也可以杀死任何外键关系,并在完成时将它们添加回来。否则,它将进行查找以检查插入的每一行中每个 FK 值的有效性。其他约束也是如此。
使用递归 CTE一次生成和插入大量行:
with table1Test
as (
--
-- generate some test rows
--
)
insert into table1 select ... from table1Test
你可以看看 redgate 工具,他们有一个叫做数据生成器的工具。它可以帮助您不必编写自己的脚本,我相信他们已经以某种方式优化了插入速度。
(免责声明,我与 redgate 无关,就像软件一样)。