通过C#优化这个大型SQL插入的策略?

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

问题:目前文件并非唯一标识。

所以,我们想要做的是,为每个文件:

  • 插入一条记录。 记录中的一个字段应该包括一个亚马逊S3密钥,该密钥应该包含新插入的记录的ID。
  • 重命名该文件以包含该ID,以便它与该键的格式相匹配。
  • 我能想到的最好的事情是:

  • 运行一个单独的插入命令,返回添加的行的ID。
  • 将它作为属性添加到我正在循环的单个业务对象中。
  • 生成更新S3密钥以包含ID的更新语句
  • 输出文件,将ID连接到文件名结尾。
  • 据我所知,这看起来是:

  • 150万个插入语句
  • 单独的SqlCommand执行和读取,因为我们需要返回ID),
  • 在一个物体上设置一个属性150万次。
  • 生成并执行150万条更新语句
  • 或许可以将这个巨大的连接更新语句一次性完成; 不知道这是否有帮助
  • 150万个文件副本。
  • 我无法绕过实际的文件部分,但其余部分,有没有更好的策略,我没有看到?


    如果你让客户端应用程序生成ID,你可以使用一个简单的SqlBulkCopy来一次插入所有的行。 这将在几秒钟内完成。

    如果您想保留列的IDENTITY属性,则可以运行DBCC CHECKIDENT(RESEED)将身份计数器前进1.5米,以为您提供可插入的有保证的差距。 如果行数不是静态的,你可以用更小的数据块来执行插入,直到完成。


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

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

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

    我认为,这个速度就像你能做到的一样快。

    链接地址: http://www.djcxy.com/p/74285.html

    上一篇: Strategy to optimize this large SQL insert via C#?

    下一篇: Best way to classify labeled sentences from a set of documents