在 Windows Server 2019 中为 SQL Server 实例释放内存?

rbh*_*hat 3 windows memory memory-usage sql-server windows-server-2019

我们有 Windows Server 2019 Standard (x64),内存为 64GB。

下面的屏幕截图显示了SQL Server Windows NT运行时的内存使用率为 96% ,并且使用了 344.5 MB。

在此输入图像描述

这是停止SQL Server Windows NT服务后的任务管理器。内存使用率下降至 8%。

在此输入图像描述

我再次启动SQL Server Windows NT服务。任务管理器非常低,为 9%,但 Sql 服务器现在使用的内存比内存使用率为 96% 时更多。 在此输入图像描述

两个问题:

  1. 内存有什么问题吗?
  2. 如何在不重新启动 sql server 实例的情况下降低内存使用量?

Mas*_*imo 9

这里遗漏了一个重要的细节:任务管理器显示 SQL Server 仅使用 344.5 MB RAM,但它实际上保留了更多(几乎全部)供自己使用。任务管理器不会显示此内容。任务管理器中的数字实际上并没有达到系统内存的 97%,因为那里没有显示保留内存。

您假设几乎所有内存都被其他东西用完了,因此 SQL Server 无法使用超过 344.5 MB 的内存,这是完全错误的。它不是这样工作的。任务管理器可能会产生很大的误导,请查看实际的性能计数器。


更新以尝试更好地解释它。

SQL Server在设计上将数据缓存在内存中,随着时间的推移,它将耗尽系统中几乎所有的可用内存;但是这个内存并没有显示在任务管理器中(或者至少不是全部),因为 SQL Server 试图表现得很好并告诉操作系统“我想要这么多内存,但它只是用于缓存,没有它我也能生存,因此,如果需要,请随时回收它”。这意味着任务管理器显示 SQL Server 使用的内存比实际保留的内存少得多。

绝不是一个问题;这是有意而为之的。您看到的“问题”并不存在,只是您在任务管理器中看到的内容具有误导性。

如果您停止 SQL Server,它当然会释放所有已分配的内存,包括任务管理器中显示的内存和未显示的内存(更多)。当您再次启动它时,它将使用很少的内存:随着 SQL Server 将数据加载到内存中并对其进行缓存,使用量将随着时间的推移再次增长。但大部分内存不会显示在任务管理器中,因为该特定工具无法看到它。

我还要补充一点,如果 SQL Server 确实需要内存,它会以不同的方式分配它,然后任务管理器会显示它;如果 SQL Server 确实需要那么多内存,那么您会看到 SQL Server 使用了 60 GB 内存,而不是仅将其用于缓存。

  • 您所做的实际上表明耗尽您所有内存的进程“正是”SQL Server,否则重新启动它不会对内存使用产生影响。 (3认同)

mfi*_*nni 8

你在这台机器上运行 SQL Server,所以它正在做 SQL Server 所做的事情 - 它保留操作系统上(几乎)所有可用的内存,这样当它进行大查询或其他操作时,它就不必分配 RAM ,它已经有了。

你有几个选择。

  1. 接受。如果您仅在此计算机上运行 SQL Server,那么它会按预期运行。不要管它。
  2. 盖上盖子。如果您需要在此服务器上运行其他工作负载,则可以限制 SQL 将保留的 RAM 量。

我绝对不会选择选项 2,除非 SQL 永远不会使用它占用的 RAM。只有在测量操作系统级 SQL 性能计数器和 SQL 级动态管理视图时您才会知道这一点。

从大局来看,您实际上想解决什么问题?在这种情况下,“释放内存”是一项毫无意义的任务,除非您知道您正在将其释放以供其他用途使用。您是否遇到 SQL 性能问题?如果是,您如何确定您的瓶颈是 RAM,而不是糟糕的索引设计或未优化的查询?

我引导您使用适当的监控来诊断性能问题。为此,您需要了解大量有关 SQL 的知识和相当多的有关 Windows 的知识。如果您不是 DBA,请雇用一名 DBA 或签订合同,或者与您的软件供应商合作(如果这是针对已购买产品的 SQL)。如果这是你的公司在没有 DBA 的情况下自己编写的东西,那就去找一个吧。

https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/monitor-memory-usage?view=sql-server-ver15

默认情况下,随着时间的推移,SQL Server 实例可能会消耗服务器中大部分可用的 Windows 操作系统内存。一旦获取内存,除非检测到内存压力,否则不会释放。这是设计使然,并不表示 SQL Server 进程中存在内存泄漏。

/根据您的编辑进行编辑:

虽然我不是系统管理员,但在我看来,sql server 占用的内存很少,因为其他所有内容都被 Windows 消耗了。

你在这里几乎肯定是错的。正如我上面提到的,随着时间的推移,SQL Server 将分配几乎所有的系统 RAM。sqlserver.exe 进程使用的 RAM 量并不能告诉您 SQL 实际分配了多少 RAM。DMV 和性能计数器会告诉您这一点。

我使用 SSMS 来处理数据库,我直接注意到一切都很慢。即使是简单的事情,例如打开表格窗格来查看我的所有表格,也需要一段时间,有时甚至会超时。

不要在 SQL 服务器上运行它,而是从您的工作站运行它。