我有一个脚本,可以按顺序向 SQL Server 数据库中执行 15 个批量插入操作,所有操作均基于以下内容:
BULK INSERT M_USERS
FROM '\\spath\users.txt'
WITH (
BATCHSIZE = 1000,
FIELDTERMINATOR = '|',
ROWTERMINATOR = '\n',
FIRSTROW = 2,
ERRORFILE='\\spath\users.err'
)
GO
这 15 个文本文件大小不一。有些文件少于 5000 行,而最大的文件则超过 5,000,000 行。我在一台拥有 12 GB 内存和 24GB 页面文件的服务器上运行该脚本。一旦启动,我注意到该服务器上的物理内存使用率稳步增加,直到接近 100%。即使脚本完成(或由于内存不足而失败),内存使用率也从未下降。似乎 Sql Server 从未释放用于执行批量插入的内存资源。
是否有人知道我是否可以通过修改脚本来解决这个问题,或者这是 SQL Server 的问题?
编辑:最终我收到错误“资源池‘内部’中的系统内存不足以运行此查询。”并且之后一切都失败了。
答案1
这是设计使然。除非您限制 SQL Server 可以访问的内存量,否则它将占用尽可能多的内存。这通常不是坏事。SQL 有自己的内部操作系统,用于线程池和内存管理等功能,并且非常擅长这些功能。添加如此多的数据很可能会导致 SQL 将大量数据放入其存储在内存中的数据缓存中(以及其他一些内容)。
如果 SQL Server 是计算机上唯一运行的程序,那么一般规则是让它拥有除 1.5/2 GB 之外的所有内存,并将其保留给服务器操作系统。您为 SQL Server 分配的内存越多,它就越高兴。
根据您的编辑进行编辑:
您肯定会希望限制 SQL Server 使用的内存。我无法确定您使用了多少字节,但您可能正在导致服务器交换 SQL,这是个坏消息。
在 SQL Server Managment Studio 的对象资源管理器中:
- 右键单击您的服务器实例
- 单击左侧导航列表中的“内存”
- 将“最大服务器内存(以 MB 为单位)”设置为 10000 至 15000(10-15 GB)之间的某个值。
- 单击“确定”
或者,您也可以在查询窗口中运行此操作:
sp_configure 'max server memory (MB)',10000
GO
RECONFIGURE
GO
10000 将 SQL 内存限制为 10GB。