如何处理大型SQL SERVER批量插入?

时间:2008-10-08 14:58:45

标签: sql sql-server batch-file insert out-of-memory

我希望在迁移项目中执行一系列查询。要生成的脚本是从分析遗留数据库然后生成脚本以将每个旧实体映射到适当的新记录的工具生成的。这些脚本适用于小型实体,但有些数据库中有数十万条记录可生成大约80 MB的脚本文件。

运行这些脚本的最佳方法是什么?

是否有一些SQLCMD来自处理更大脚本的提示?

我还可以将脚本分解为更小的脚本,但我不想执行数百个脚本来执行迁移。

5 个答案:

答案 0 :(得分:2)

如果可能,修改导出工具以导出BULK INSERT兼容文件。

除此之外,您可以编写一个程序,将插入语句解析为BULK INSERT将接受的内容。

答案 1 :(得分:1)

BULK INSERT使用BCP format files which come in traditional (non-XML) or XML。它是否必须获得一个新的身份并在孩子身上使用它而你无法使用SET IDENTITY INSERT ON,因为数据库设计已经发生了很大变化?如果是这样,我认为你可能最好使用SSIS或类似的东西,并在分配身份后进行合并加入。您还可以使用SSIS或BCP将数据加载到SQL中的登台表中,然后使用常规SQL(可能在SQL任务中的SSIS中)with the OUTPUT INTO feature to capture the identities and use them in the children

答案 2 :(得分:0)

听起来这会为每一行生成一个INSERT,这实际上会非常慢。如果它们都包含在一个事务中,那也可能有点慢(虽然行数不会那么大,以至于它会导致事务几乎不可能 - 就像你持有数百万行一样在事务中插入。)

您可能最好不要使用ETL(DTS,SSIS,BCP或BULK INSERT FROM或其他工具)来迁移数据,而不是编写每个插入脚本。

你可以分解脚本并在部分中执行它(特别是当前它使它成为一个大事务),只需使用PowerShell或类似程序自动执行各个脚本。

答案 3 :(得分:0)

只需执行脚本即可。我们定期运行大小为100 Mb的备份/恢复脚本。它只需要30秒左右。

如果关键是不要阻止你的服务器这个数量的时间,你将不得不真的分裂它。

同时查看mysqldump的-tab选项,使用TO OUTFILE输出数据,这样可以更高效,更快地加载。

答案 4 :(得分:0)

我一直在从文件选项中查看“BULK INSERT”,但看不到文件格式的任何示例。文件可以混合行格式还是必须始终以CSV方式保持一致?我问的原因是我在各种父/子表中都涉及到身份,这就是为什么当前正在使用每行插入的原因。