我从搜索中了解到SQL Server 2012将继续使用内存,直到它达到设置的限制为止,但我看到的用法很难相信。目前数据库大约26MB,但内存使用量超过30GB。这是预期的还是潜伏在某个地方?
答案 0 :(得分:1)
没有错。分配给SQL Server的内存可以更改为您想要的几乎任何值。我说如果它是实例上唯一的数据库,那么对于26MB的数据库来说,30GB肯定是过度的。分配给SQL Server的内存用于许多功能,例如,排序查询,计划缓存等。您看到的30GB意味着为SQL Server保留了30GB的系统内存。
为了更好地理解,您还需要查看目标内存。目标内存是SQL Server工作所需的内存量,具体取决于您的配置。在你的情况下,我打赌目标内存等于最大内存,SQL Server正在尝试消耗所有内存。您可以通过以下方式查看:
SELECT *
FROM sys.dm_os_performance_counters
WHERE counter_name in ('Total Server Memory (KB)', 'Target Server Memory (KB)')
布伦特·奥扎尔的更多信息:
那么SQL使用了多少内存?我会让你轻松一点。 SQL 服务器正在使用所有内存。周期。
无论您在系统中放入多少内存,SQL Server都将使用all 它可以直到它将整个数据库缓存在内存中然后 一些。这不是偶然的,而且有充分的理由。 SQL 服务器是一个数据库:程序员在SQL Server中存储数据,然后 SQL Server管理将该数据写入硬盘驱动器上的文件。 程序员发出SELECT语句(是的,通常是SELECT *)和SQL 服务器从驱动器中取回数据。组织 文件和驱动器是从程序员那里抽象出来的。
为了提高性能,SQL Server将数据缓存在内存中。 SQL Server 没有共享磁盘模型:只有一个服务器的SQLserver.exe可以 在任何给定时间触摸数据文件。 SQL Server一旦知道就知道了 从驱动器读取一段数据,除非数据不变 SQL Server本身需要更新它。数据可以读入内存 曾经安全地永远保持着。我的意思是永远 - 只要多久 随着SQL Server的启动,它可以将相同的数据保存在内存中。如果你有 具有足够内存的服务器,用于缓存整个数据库,SQL Server 会这样做的。为什么SQL Server不释放内存?
内存弥补了很多数据库的错误:
Slow, cheap storage (like SATA hard drives and 1Gb iSCSI) Programs that needlessly retrieve too much data Databases that don’t have good indexes CPUs that can’t build query plans fast enough
在这些问题上留下足够的内存,它们就会消失,所以SQL Server 想要使用它可以获得的所有内存。它还假设更多 查询可以随时进入,因此它永远不会放弃或释放 内存,除非服务器受到内存压力(如果其他 应用需要内存,Windows发出内存压力 通知)。
默认情况下,SQL Server假定其服务器存在于唯一的服务器中 托管数据库的目的,因此内存的默认设置是 无限最大。 (有一些版本/版本限制,但是 让我们现在保持简单。)这是件好事;它意味着 默认设置掩盖了罪恶。找出服务器的 记忆有效地掩盖了罪恶,我们必须做一些事情 调查。
有关SQL Server内存配置的文档:https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/server-memory-server-configuration-options
以下是如何为SQL Server上的最小/最大内存设置固定金额:https://technet.microsoft.com/en-us/library/ms191144(v=sql.105).aspx