SQL Server 2012中长时间运行的存储过程中的内存消耗

时间:2014-10-07 22:27:39

标签: sql-server stored-procedures memory bulkinsert database-performance

我在具有16 GB RAM的新服务器中使用SQL Server 2012。 我在50 GB数据库上有一个长时间运行的存储过程,在输入表中有大约250万条记录。此过程读取一个表(输入表)并规范化行(大多数列具有文本值而不是ID),将规范化的行插入另一个表中。 有什么问题? SQL Server服务的内存消耗尽可能地增加。我必须设置一个上限,以避免冻结服务器。 这是正常的吗?我知道SQL Server在内存上维护数据而不是释放内存以避免将来再次加载它,但在我的情况下,我将来不需要它,因为这只是一个读取数据,规范化它和把它移到另一张桌子。

2 个答案:

答案 0 :(得分:2)

你所描述的是绝对正常的。 SQL Server在内存中缓存尽可能多的数据,因为它可以加快执行时间。 RAM之旅比硬盘驱动器快得多。没有限制,即使操作系统必须将内容分页到磁盘,它也会将所有内容都填入内存。这会使您的服务器变慢。

当SQL Server达到其内存限制时,它将决定保留什么以及清除什么以为新数据腾出空间。不要试图微观管理它。

答案 1 :(得分:0)

尝试在处理之后使用此代码块,并将其安排在SQL作业中,并根据您的方便更改内存值。

IF (SELECT ( physical_memory_in_use_kb / 1024 )FROM sys.dm_os_process_memory)>=7000
BEGIN
    EXEC sp_configure 'show advanced options', 1
    RECONFIGURE WITH OVERRIDE
    EXEC sp_configure 'max server memory', 5120  --5GB
    RECONFIGURE WITH OVERRIDE
    WAITFOR DELAY '00:02:00' 
    EXEC sp_configure 'max server memory', 40960  --40 GB
    RECONFIGURE WITH OVERRIDE

END