网站推广营销策划方案,网站页面建议,创建网站销售产品,dedecms模板自适应今天在利用sql查询数据时出现如下错误
在执行批处理时出现错误。错误消息为: 引发类型为“System.OutOfMemoryException”的异常。 症状
使用 SSMS 运行返回大量数据的 SQL 查询时#xff0c;会收到类似于以下内容的错误消息#xff1a; 执行批处理时出错。 错误消息为会收到类似于以下内容的错误消息 执行批处理时出错。 错误消息为引发了“System.OutOfMemoryException”类型的异常 原因
出现此问题的原因是 SSMS 的内存不足无法为大型结果分配内存。 备注
SSMS 是一个 32 位进程。 因此内存限制为 2 GB。 SSMS 对结果窗口中每个数据库字段可以显示的文本量施加人为限制。 此限制在“网格”模式下为 64 KB在文本模式下为 8 KB。 如果结果集太大则显示查询结果所需的内存可能会超过 SSMS 进程的 2 GB 限制。 因此大型结果集可能会导致 症状 部分中提到的错误。 解决方法
若要解决此问题请尝试以下方法之一。
方法 1将结果输出为文本
配置查询窗口以文本的形式输出查询结果。 文本输出使用的内存比网格少并且可能足以显示查询结果。 若要进行此更改请执行以下步骤
右键单击查询窗口。单击“结果” 。单击“ 结果到文本”。
方法 2将结果输出到文件
配置查询窗口以将查询结果输出到文件。 文件输出使用最少量的内存。 这将保留更多内存来存储结果集。 若要进行此更改请执行以下步骤
右键单击查询窗口。单击“结果” 。单击“ 结果到文件”。运行查询然后选择保存结果文件的位置。
方法 3使用 sqlcmd
使用 sqlcmd 实用工具 而不是 SSMS运行 SQL 查询。 此方法允许在没有 SSMS UI 所需的资源的情况下运行查询。 此外可以使用 64 位版本的 Sqlcmd.exe 来避免影响 32 位 SSMS 进程的内存限制。 网上有的说是因为sqlserver打开的窗口太多了关掉一部分就好了我试了一下貌似也可以。
网上查询了一下发现SQL server的内存使用机制是这样的
SQL Server 数据库的内存使用原则是有多少内存就会占用多少内存不会自动释放内存。原因是它的存储引擎本身是一个Windows下的进程所以在使用内存时和其它Windows进程是一样的都要向Windows申请内存申请到内存之后SQL Server的内存使用可以粗略地分为两个部分一是缓冲池内存被数据页和空闲页占用二是非缓冲内存被线程、DLL、链接服务器等占用。其中缓冲池内存占大头。
这样会有什么问题呢打个比方如在执行一条结果集很大的 sql 时数据查询取出后会一直占用内存直到机器内存被占满(并不会撑爆因为可以通过图去限制最大内存一般占满后仍然比服务器机器内存稍小)在重启数据库服务前SQL Server不会主动释放该内存也没有任何办法可人为释放一直占用到 max server memory 的设定值因此查看 SQL Server的内存基本使用率相对较高80%以上。
那怎么解决呢最直接的办法是人为修改最大可占用物理内存进行限制。
这样看起来网上的这种说法也是有一句可循的。