【问题标题】:Inserting 1000s of rows to SQL table using SSMS使用 SSMS 将 1000 行插入 SQL 表
【发布时间】:2009-11-25 06:45:02
【问题描述】:

我有一个带有插入语句的 sql 脚本来插入 1000 行(大约 12000 行)。 当我尝试在 SSMS 中运行脚本时,它会在一段时间后引发“内存不足”异常。

"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown."

我有 SQL Server 2008 on Vista 和 3gb RAM。

任何想法或指点将不胜感激!

【问题讨论】:

  • 你能把脚本贴出来吗,至少是简化版?
  • 是 Express 还是标准/开发?
  • 是的,这种情况发生了很多次。请参阅下面的答案,了解我是如何修复它的。

标签: sql sql-server-2008 ssms


【解决方案1】:

您将不得不拆分命令。最简单的方法是每 10 行左右添加一个 GO。

基本上,SSMS 会尝试将所有文​​本加载到 单个 SqlCommand.CommandText 并执行它。那是行不通的。

您需要获取它来对它们进行批处理。 GO 是 SSMS 中的一个简单拆分点,它将占用该点并执行它,然后继续。

LINE1
LINE2
...
去吧

LINE11
LINE12

这将在 2 个 SqlCommands 中运行到数据库。
如果您需要它们全部在单个事务中运行,您可能必须编写一个命令行应用程序来加载每一行并在事务中执行它。我不认为您可以在 SSMS 中跨执行拆分事务。

您也可以构建一个 SSIS 包,但这是一项繁重的工作,我不建议您这样做,除非您需要经常重复此过程。

【讨论】:

    【解决方案2】:

    System.OutOfMemoryException 是 CLR 异常,而不是 SQL Server 异常。 SQL 会引发错误 701,此外它不会因为简单地执行一些 insrts 而耗尽内存。

    您收到 CLR 异常的事实表明问题可能出在 SSMS 本身。确保您的脚本不会向 SSMS 返回虚假的结果集和消息。另外,尝试从 sqlcmd 执行脚本。

    【讨论】:

    • 他的错误是正确的。 SQL Management Studio (SSMS) 内存不足,并在其中运行 .Net 代码。
    【解决方案3】:

    这是一篇旧帖子,但似乎没有人发现明显的问题。所以我想发布一个回复,可以帮助有人寻找答案。在 SQL Server\Properties\Memory 下,有一个“每个查询的最小内存”设置。您可以暂时提高此数字以帮助增加 GO 语句之间的记录数。在我的情况下,我将它提高到 5000(10000 导致系统内存不足错误,不好)所以我选择了 5000,经过几次测试后我发现我现在可以导入大约 20,000 行,所以我每 20,000 行放置一个 GO 语句(大约花了 10 分钟),我能够在一个查询中导入超过 200,000 行。

    快乐的编码,罗伯

    【讨论】:

      【解决方案4】:

      您可能需要插入奇数 commit 以免填满事务日志。

      【讨论】:

      • @paxdiablo:你的意思是说,行需要拆分成多个事务?
      • 是的,只是作为一般建议,而不是作为对您的特定问题的答案(这就是我将其设为社区 wiki 的原因)。并且只有当它们实际上是一开始的交易时。我知道如果您不手动执行,DB2 会自动启动事务 - 可能是 SQL Server 不这样做,而是将每个插入视为单个工作单元。
      【解决方案5】:

      修复结果是批量运行插入语句。我做了一些实验来确定我可以在事务中执行的最大插入数。

      因此,对我有用的解决方法是将插入语句分成更小的组 (5000) 并将它们标记为带有提交的事务。对所有组重复相同的操作。它没有给出“内存不足”异常。

      但在更黑暗的一面,我花了 2 小时来插入 50,000 行,这让我感到惊讶。有什么方法可以让我在更短的时间内完成吗?

      感谢您所有的 cmets。特别是 paxdiablo 和 Jason Short 指出了解决方案,其他人则找出了原因。

      【讨论】:

        【解决方案6】:

        确保使用 SET NOCOUNT ON;

        代替:

          INSERT ... VALUES (...)
          INSERT ... VALUES (...)
          INSERT ... VALUES (...)
        

        您也可以尝试使用以下代码构建您的脚本,它作为单个隐式事务工作(避免在每次插入之间运行 COMMIT):

          INSERT ... SELECT ...
          UNION ALL  SELECT ...
          UNION ALL  SELECT ...
        

        但是,如果整个脚本对于 SSMS 来说仍然太大而无法处理(我想您正在插入一些冗长的字符串),那么您唯一的选择就是其他人建议的...拆分您的脚本或使用其他工具.

        【讨论】:

          【解决方案7】:

          我通过在其中调用存储过程来使用游标插入 但因内存不足异常而失败

          我把 go 放在最后一个存储过程中,它提高了一些性能

          上次在 management studio 中将 grid view 更改为 Text view 效果很好。

          【讨论】:

            【解决方案8】:

            打开 > 任务管理器 > 关闭 SSMS 服务

            然后再次打开SSMS工作室 现在您可以运行查询了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-28
              • 2011-09-21
              • 1970-01-01
              • 2013-01-28
              • 2019-10-07
              • 1970-01-01
              相关资源
              最近更新 更多