【问题标题】:SQL Buffer pages rapidly increasing SQL Server memory usageSQL Buffer 页面快速增加 SQL Server 内存使用量
【发布时间】:2015-10-05 14:27:35
【问题描述】:

我编写了一个程序来提取存储在数据库中的 PDF 文件,并将它们存储到文件系统中。这将针对包含大约 200 万条记录的表执行。该程序在每个查询中抓取 1000 个文档块中的数据(使用小型 c# 应用程序并行执行)。

我面临的问题是 SQL Server 的内存使用情况。我最终得到一个System.OutOfMemory 异常并需要终止程序(我不再有异常详细信息),并且分配的内存似乎被缓冲页面的数量所使用。运行程序 5 分钟后,我执行了 194'443 个页面,占用了 1519MB 内存。

我已经尝试使用DBCC DROPCLEANBUFFERS 并且这可行,但这不是一个选项,因为我将在客户站点上运行此程序,并且不想影响任何其他数据库。

有没有人知道一种方法可以阻止 SQL Server 将页面存储在内存中,或者在不影响该实例中的任何其他数据库的情况下刷新已使用的特定内存部分?

我正在使用 C# 应用程序连接到数据库。我的数据提供程序使用 PetaPoco 工作,它使用 System.Data.SqlClient 类连接到 SQL Server 数据库。

【问题讨论】:

  • 发布代码。在您的描述中没有可以用来帮助您的信息。你如何连接到数据库?你在使用USING 语句吗?是否有待处理的连接?查看here 以获取有关如何提问的提示。
  • 我已经更新了我的问题。谢谢。
  • 您是否正确配置了最大内存?您是否在同一台服务器上运行其他应用程序? SQL Server 不应该只是内存不足

标签: c# sql-server memory buffer


【解决方案1】:

您不能有选择地刷新 SQL Server 中的部分内存。不是每次查询 1000 个文档,而是从较小的文件开始,也许是 100 个,然后测试你的方式直到“合理”状态。导致检索 1000 个文档的单个 READ 意味着 SQL Server 必须缓存所有这些以服务您的查询,并且在您的查询完成之前不能释放任何它。这可能需要很长时间,具体取决于您在该事务中还有什么、IO 容量等......

除了内存之外,您在处理 1000 个文档时可能会阻止其他查询,这可能会让您的客户对随机 DBCC DROPCLEANBUFFERS 同样不满意

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多