7

我有大约 150 万个文件需要在数据库中插入记录。每条记录都插入一个包含文件名的键。

问题:这些文件目前没有唯一标识。

所以,我们想做的是,对于每个文件:

  • 插入一条记录。记录中的一个字段应包括一个亚马逊 S3 密钥,该密钥应包括新插入记录的 ID。
  • 重命名文件以包含 ID,使其与密钥的格式匹配。

我能想到的最好的事情是:

  • 运行返回添加行的 ID 的单个插入命令。
  • 将其作为属性添加回我正在循环的单个业务对象。
  • 生成更新 S3 密钥以包含 ID 的更新语句
  • 输出文件,将ID连接到文件名的末尾。

据我所知,这看起来是:

  • 150 万条插入语句
    • 单独的 SqlCommand 执行和读取,因为我们需要返回 ID),
  • 150 万次在对象上设置属性。
  • 生成并执行了 150 万条更新语句
    • 也许可以把它变成一个巨大的连接更新语句来一次完成它们;不确定这是否有帮助
  • 150 万份文件副本。

我无法绕过实际的文件部分,但对于其余部分,是否有更好的策略我没有看到?

4

2 回答 2

3

如果您让客户端应用程序生成 ID,您可以使用直截了当的SqlBulkCopy方式一次插入所有行。它将在几秒钟内完成。

如果要保留IDENTITY列的属性,可以运行 aDBCC CHECKIDENT(RESEED)以将标识计数器推进 1.5m,以提供可以插入的保证间隙。如果行数不是静态已知的,您可以执行插入可能为 100k 的较小块,直到您完成。

于 2013-09-18T16:13:53.113 回答
1

通过不依赖数据库为每一行生成您的 ID,您可以将 SQL 语句的数量减少一半。在本地执行所有操作(包括分配 ID),然后在最后执行一批插入,使用identity_insert on.

这将导致 SQL Server 将您的 ID 用于这批记录。

如果这仍然太慢(可能有 150 万次插入),下一步是将数据输出到文本文件(XML、逗号分隔或其他),然后对文件执行批量导入操作。

我想,这就是你能做到的最快速度。

于 2013-09-18T15:57:50.827 回答