MSSQL批处理插入操作增加了内存使用情况



我在MSSQL上运行以下批次插入查询:

WHILE 1<2 --busy loop until user stops the query
BEGIN
DECLARE @batch int = 200000
BEGIN TRANSACTION
WHILE @batch > 0
BEGIN
DECLARE @hourRand int = CONVERT(int,60*RAND() )
DECLARE @minRand int = CONVERT(int,60*RAND() )
--...more DECLAREs... --
INSERT INTO dbo.details (COLUMN1,COLUMN2) VALUES (@hourRand, @minRand, ...)
set @batch = @batch - 1
END
COMMIT
END

当我将此查询留在上面时,SQL的内存使用情况会不断增长。为什么这个循环会导致内存增长?插入的条目是否存储在某种占用内存的缓存或缓冲区中?如果是这样,我该如何释放所使用的内存?

我知道SQL会根据需要生长其内存池,但是当服务器的内存使用率接近98%时,我的查询开始悬挂,因此我认为这只是内存池很大。SQL似乎实际上是在"使用"其保留在上的大多数内存。

重新启动服务器可以按预期释放内存,但是我不能经常将服务器用尽。

谢谢您的帮助!

这里没有问题。所有服务器数据库都可以广泛使用缓存,并且除非需要,否则请勿发布内存,例如,可用的免费RAM降至一定的阈值以下。服务器不会用完RAM。试图"释放"内存将降低性能,因为服务器将必须从存储中读取数据。

至于交接查询,这可能与您在一次交易中插入200k插入语句的事实可能更多,并且您可能会遇到锁定或僵局问题。

这个人为示例,在批处理操作中不显示服务器的行为。批次永远不会长200万。如果要导入200k行,请在服务器侧或客户端上使用SQLBulkCopy插入。

SQL Server用于数据仓库应用程序,其中典型的导入尺寸为数百万行。诀窍是使用适当的工具来完成此作业,例如批量插入,SSIS和适当使用分期数据库。

,因为您正在trans中进行所有这些工作。

COMMIT在您的INSERT之后或更好地删除开始交易并提交

您正在尝试插入200000记录。

您最初试图在每个记录上提交,并且插入非常慢。然后,您更改了所有插入结束后的提交。

尝试对插入的记录数进行计数器一旦此计数器达到10000,并将其重新定位为0。

不要忘记结束提交这应该解决您的内存问题,并且插入也应该更快。继续使用数字10000,直到您满意插入速度和内存使用速度为止。

最新更新