SQL Server 大容量插入物理内存问题

Mic*_*eck 3 memory sql-server

我有一个脚本,它按顺序对 SQL Server 数据库执行 15 个批量插入操作,所有操作都基于以下内容:

BULK INSERT M_USERS
    FROM '\\spath\users.txt'
    WITH ( 
        BATCHSIZE = 1000, 
        FIELDTERMINATOR = '|', 
        ROWTERMINATOR = '\n', 
        FIRSTROW = 2,
        ERRORFILE='\\spath\users.err'
    )
GO
Run Code Online (Sandbox Code Playgroud)

15 个文本文件的大小各不相同。有些有不到 5000 行,而最大的有超过 5,000,000 行。我在具有 12 GB 内存和 24 GB 页面文件的服务器上运行该脚本。启动后,我注意到该服务器上的物理内存使用量稳步增加,直到接近 100%。即使脚本完成(或由于内存不足而失败),内存使用量也不会下降。似乎 Sql Server 永远不会释放它用于执行批量插入的内存资源。

有谁知道我是否可以通过修改我的脚本来解决这个问题,或者这是 SQL Server 的问题吗?

编辑:最终我收到错误消息“资源池‘内部’中的系统内存不足,无法运行此查询。” 之后一切都失败了。

squ*_*man 5

这是设计使然。除非您限制 SQL Server 可以访问的内存量,否则将尽可能多地占用内存。这通常不是一件坏事。SQL 有自己的内部操作系统,用于线程池和内存管理等方面,并且非常擅长这些方面。添加如此多的数据很可能会导致 SQL 在其存储在内存中的数据缓存(以及其他一些内容)中放入大量数据。

如果 SQL Server 是您计算机上唯一运行的东西,那么一般规则是让它拥有除 1.5 / 2 GB 之外的所有内存,并将其保留给服务器操作系统。您可以在 SQL Server 上投入的内存越多,它就会越开心。

针对您的编辑进行编辑:
您肯定希望限制 SQL Server 将使用的内存。我不能确定您正在使用多少字节,但您可能会导致您的服务器交换 SQL,这是个坏消息。

在 SQL Server Management Studio 的对象资源管理器中:

  • 右键单击您的服务器实例
  • 单击左侧导航列表中的内存
  • 将最大服务器内存(以 MB 为单位)设置为 10000 到 15000 (10-15 GB) 之间的值。
  • 单击确定

或者,您也可以在查询窗口中运行它:

sp_configure 'max server memory (MB)',10000
GO
RECONFIGURE
GO
Run Code Online (Sandbox Code Playgroud)

10000 个上限为 10GB 的 SQL 内存。