我有一个带有insert语句的sql脚本,可插入1000行(约12000行)。 当我尝试在SSMS中运行脚本时,它会在一段时间后抛出“Out of memory”异常。
"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown."
我在Vista上安装了3GB RAM的SQL Server 2008。
任何想法或指示都将不胜感激!
答案 0 :(得分:4)
您必须拆分命令。最简单的方法是每10行左右添加一个GO。
基本上SSMS正在尝试将所有文本加载到单个 SqlCommand.CommandText中并执行它。那不行。
你需要让它批处理它们。 GO是SSMS中的一个简单分割点,它将占用该点并执行它,然后继续。
LINE1
LINE2
...
GO
LINE11
LINE12
这将在2个SqlCommands中运行到数据库 如果您需要它们都在单个事务中运行,您可能必须编写命令行应用程序来加载每一行并在事务中执行它。我不认为您可以在SSMS中跨执行分割事务。
您也可以构建一个SSIS包,但这是很多工作,除非您需要经常重复此过程,否则我不推荐它。
答案 1 :(得分:3)
System.OutOfMemoryException是一个CLR异常,而不是SQL Server异常。 SQL会引发错误701,除此之外,只需执行一些insrts就不会耗尽内存。
您获得CLR异常的事实表明问题可能出在SSMS本身。确保您的脚本不会将虚假结果集和消息返回给SSMS。另外,尝试从sqlcmd执行脚本。
答案 2 :(得分:2)
这是一个老帖子,但似乎没有人发现明显的问题。所以我想发布一个可能有助于搜索答案的人的回复。在SQL Server \ Properties \ Memory下,有一个每个查询的最小内存设置。您可以暂时提高此数字,以帮助增加GO语句之间的记录数。在我的情况下,我把它提高到5000(10000导致系统内存错误,不好)所以我安顿了5000,经过几次测试后我发现我现在可以导入大约20,000行所以我每隔20,000行放置一个GO语句(花了大约10分钟),我能够在一个查询中导入超过200,000行。
快乐编码,Rob
答案 3 :(得分:1)
您可能需要插入奇数commit
以便不填写事务日志。
答案 4 :(得分:1)
该修复程序结果是批量运行insert语句。我做了一些实验,以确定我可以在交易中完成的最大插入次数。
因此,对我有用的修复方法是将insert语句拆分为较小的组(5000)并将其标记为带提交的事务。对所有组重复相同的操作。它没有给出“内存不足”的例外情况。
但是在较暗的一面,我花了2小时插入50,000行,这让我感到惊讶。有没有办法可以在更短的时间内完成它?
感谢您的所有评论。特别是paxdiablo和Jason Short指出解决方案和其他所有人推理原因。
答案 5 :(得分:0)
确保使用SET NOCOUNT ON;
而不是:
INSERT ... VALUES (...)
INSERT ... VALUES (...)
INSERT ... VALUES (...)
您也可以尝试使用以下代码构建脚本,它作为单个隐式事务工作(避免在每个插入之间运行COMMIT):
INSERT ... SELECT ...
UNION ALL SELECT ...
UNION ALL SELECT ...
但是,如果整个脚本仍然太大而无法处理SSMS(我想你正在插入一些冗长的字符串),那么你唯一的选择就像其他人建议的那样......分割你的脚本或者使用不同的工具
答案 6 :(得分:0)
我通过调用其中的存储过程来插入游标 但失败的内存异常
我把 go 放在最后一个存储过程中,它增加了一些性能
最近在管理工作室中将网格视图更改为文字视图工作正常。
答案 7 :(得分:0)
打开>任务管理器>关闭SSMS服务
然后再次打开SSMS工作室 现在您可以运行查询。