我创建了一个非常基本的 SQL 表,如下所示
CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
然后我执行了 3 Gig Bulk Insert
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Run Code Online (Sandbox Code Playgroud)
然后 SQL 服务器的 RAM 使用量飙升,吃掉了大约 30Go 的 RAM:


我更愿意认为这是一种异常行为,可以采取措施来避免这种情况。
编辑:
好的,这似乎是默认行为。很公平。
但是,为什么在批量插入完成后很久没有释放内存?
一些额外的考虑:
至于有关 SQL 服务器在操作系统“告知”时释放内存的评论,我在 24 核 32 Gb Xeon 服务器上的实践经验证明这是不准确的:一旦内存消耗大的 BCP 提取结束我有一个数据处理应用程序的 .Net 实例池,它们需要处理提取的数据,并且它们会窒息/争吵以共享剩余内存以尝试执行它们的工作,这比打开 SQL Server 需要更长的时间关闭,内存可供所有应用程序共享。我必须停止 …
我有点好奇,具有 128 GB 数据库 RAM 大小的 SQL 2012 企业版之一是 370 GB 并且还在增长,锁 (OBJECTSTORE_LOCK_Manager) 内存管理员使用的内存量显示为 7466016 KB。我也可以通过查看性能计数器来确认select * from sys.dm_os_performance_counters where counter_name = 'Lock Memory (KB)'
但是,当我运行查询时
select count(*) from sys.dm_tran_locks
Run Code Online (Sandbox Code Playgroud)
它只显示了 16 个锁。那么什么是使用超过 7 GB 的锁。有办法查到吗?
这是否意味着一旦分配了锁的内存,SQL 还没有释放它?在过去的 1 小时内,我没有看到锁计数超过 500,但锁内存保持不变。
最大服务器内存为 106 GB,我们没有在内存中使用锁定页面,我在过去 12 小时内没有看到任何内存压力或错误日志中的任何错误。可用 MBytes 计数器显示超过 15 GB 的可用内存。
活动监视器始终显示 0 个等待任务,因此显然没有阻塞。
考虑到 SQL 服务器锁占用大约 100 字节的内存,7 GB 是大量内存,并试图找出谁在使用它。
我通过锁计数运行服务器仪表板报告最高事务,它说“当前系统上没有运行锁定事务。但是,锁内存仍然显示如上所述。数据库在夜间最忙。
sql-server-2008 sql-server memory sql-server-2008-r2 sql-server-2012
在对其执行任何大型插入或选择语句之后,MySQL 似乎希望将整个表保留在缓存中(表大小 = ~20GB)。现在我的 innodb 缓冲池是 20GB。总内存为 32GB。我将提供一些内存使用情况和 innodb 状态的输出以及 mysqltuner 的输出。过去几天一直让我发疯。请帮忙!我感谢任何反馈,如果您需要更多信息,请告诉我。
此外,执行“FLUSH TABLES”只会在内存中关闭并重新打开它们。至少我认为这就是正在发生的事情。这是我执行一堆插入之前的 innodb 当前内存状态:
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 21978152960; in additional pool allocated 0
Dictionary memory allocated 6006471
Buffer pool size 1310719
Free buffers 347984
Database pages 936740
Old database pages 345808
Modified db pages 0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 78031, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 551887, …Run Code Online (Sandbox Code Playgroud) 我有一个 SQL Server 2012 SP2 企业版的实例,它消耗的内存比最大值高约 20GB。内存限制。实例限制为 65GB,但以下查询中使用的物理内存显示为 86GB
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Run Code Online (Sandbox Code Playgroud)
服务器是具有 2 个 NUMA 节点的物理服务器。有没有一种方法可以找出正在消耗缓冲池之外的内存的东西(我假设这就是正在发生的事情)?
这是 DBCC MEMORYSTATUS 的输出:-

这是设置的内存限制:-

提前致谢。
更新:-我已经运行了 Aaron 建议的查询
SELECT TOP (20) * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
Run Code Online (Sandbox Code Playgroud)
这是输出:-

pages_kb 的总和达到 ~60GB
更新 2:- DBCC MEMORYSTATUS 的完整输出在这里:- http://pastebin.com/nGn6kXEc
更新 3:- 此处在 excel 文件中输出 Shanky 的脚本:- http://jmp.sh/LKRlH4K
更新 4:- 输出的屏幕截图:-
SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
FROM sys.dm_os_process_memory;
GO
Run Code Online (Sandbox Code Playgroud)

所以这似乎表明 SQL Server 正在使用超过 65GB 的设置。
意外的数据库管理员在这里。
题:
即使该服务器的唯一目的是仅为 SQL Server 数据库引擎提供服务,您是否仍会手动限制 SQL Server 的最大 RAM?
我有 Microsoft Windows 2012 R2 Server、SQL Server 2012 Std、32GB RAM。
管理员不断登录到 SQL Server 以使用其控制台和所有内容。
其次,您如何检查此 Windows 服务器是否启用了 NUMA?
我正在考虑将当前的 PostgreSQL 数据仓库迁移到具有 SSD 存储和 RAM 作为主要大小变量之一的云主机。我们目前处理的最庞大的数据将存在于每月分区表中。每个月大约有 70GB 的索引(40-ish w/o)。数据可能主要是定期批量加载,然后由 5 名研究人员组成的小团队访问。
我一直在尝试在此站点上搜索有关规范 RAM 的建议,我发现的所有内容是:
是否应该有足够的 RAM 来至少将整个索引 (16GB) 加载到 RAM?我还需要提供其他详细信息吗?
我想使用Oracle的自动内存管理,限制在4GB左右。(过去的经验表明,这对于我的开发 PC 来说已经足够了,而且比这更容易了解任何性能问题。)
我相信这些是要遵循的说明:
简而言之,要启用自动内存管理,请设置 memory_target 和(可选)memory_max_target。前一个参数应该是一个动态值,后者是一个更难的限制,只能在停止/启动数据库时更改。
我将这些设置为 sysdba:
SQL> alter system set memory_target = 4G scope = spfile;
System altered.
SQL> alter system set memory_max_target = 8G scope = spfile;
System altered.
Run Code Online (Sandbox Code Playgroud)
并检查值
SQL> show parameter target;
Run Code Online (Sandbox Code Playgroud)
范围可以只是当前正常运行时间的“内存”、“spfile”或“两者”;我选择 spfile,因为我将重新启动:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
Run Code Online (Sandbox Code Playgroud)
然而,这太简单了:
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 13104M
Run Code Online (Sandbox Code Playgroud)
恢复并不难,但在我看来,如何通过内存调整也不是很明显,所以我将在下面发布我所做的事情,高级海报可以纠正/粉碎我。无论哪种情况,我都认为将它放在一个地方很好。
我在以下服务器上安装了 2 个 sql server 和 SSIS 实例。
请注意 RAM 量接近 384 GB
这是我应用于 2 个实例的最大和最小内存设置。我假设两个实例将使用相同数量的资源,如果真的是这样,184,320 MB 也就是 180 GB 是设置内存的一个很好的起始数字?
我会为 SSIS 分配多少内存?
我从 System Center Operations Manager (SCOM) 收到错误消息。
如何解决这个错误?
SQL DB 2012 Engine Stolen Server Memory 过高。
我运行查询并得到这个计数器:
???????????????????????????????????????????????
? Stolen Server Memory (MB) ? 7354.773437 ?
? Lock Memory (MB) ? 106.195312 ?
? Free Memory (MB) ? 64.632812 ?
? Connection Memory (MB) ? 24.203125 ?
? Log Pool Memory (MB) ? 14.085937 ?
? Optimizer Memory (MB) ? 2.351562 ?
? Granted Workspace Memory (MB) ? 1.296875 ?
? Cursor memory usage ? 0.000000 ?
? Cursor memory …Run Code Online (Sandbox Code Playgroud) 我最近将最大内存从默认(无限制)降低到 20 GB。这会清除计划缓存中最旧的查询吗?
memory ×10
sql-server ×7
innodb ×1
mysql ×1
numa ×1
oracle-12c ×1
plan-cache ×1
postgresql ×1
ssis ×1
ssis-2014 ×1