SqlServer内存释放

由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),

Sql Server才会释放一点点内存。所以很多时候,我们会发现运行Sql Server的系统内存往往居高不下。

这些内存一般都是Sql Server运行时候用作缓存的,例如你运行一个select语句,

那么Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来,

下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。这类的缓存叫做数据缓存。

还有一些其他类型的缓存,如执行存储过程时,Sql Server需要先编译再运行,编译后的结果也会缓存起来,

下一次就无需再次编译了。如果这些缓存已经不需要了,那么我们可以调用以下几个DBCC管理命令来清理这些缓存:

DBCC FREEPROCCACHE

DBCC FREESESSIONCACHE

DBCC FREESYSTEMCACHE(‘All‘)

DBCC DROPCLEANBUFFERS

这几个命令分别用来清除存储过程相关的缓存、会话缓存、系统缓存以及所有所有缓存

但是需要注意的是,这几个命令虽然会清除掉现有缓存,为新的缓存腾地方,

但是Sql server并不会因此释放掉已经占用的内存。无奈的是,Sql Server

并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整

Sql Server可用的物理内存设置来强迫它释放内存。

我们也可以通过Sql Server Management企业管理器进行动态控制。

连接到企业管理器之后打开Sql Server实例的属性面板,

找到内存设置,改变其中的最大服务器内存使用即可

--内存使用情况

SELECT * FROM sys.dm_os_performance_counters

WHERE counter_name IN (‘Target Server Memory (KB)‘,‘Total Server Memory (KB)‘)

-- 内存状态

DBCC MemoryStatus

--查看最小最大内存

SELECT

cfg.name AS [Name],

cfg.configuration_id AS [Number],

cfg.minimum AS [Minimum],

cfg.maximum AS [Maximum],

cfg.is_dynamic AS [Dynamic],

cfg.is_advanced AS [Advanced],

cfg.value AS [ConfigValue],

cfg.value_in_use AS [RunValue],

cfg.description AS [Description]

FROM

sys.configurations AS cfg

--设置最小最大内存

sp_configure ‘show advanced options‘, 1

go

sp_configure ‘min server memory‘, 0

RECONFIGURE

GO

sp_configure ‘max server memory‘, 2147483647

RECONFIGURE

GO

sp_configure ‘max server memory‘, 256

RECONFIGURE

GO

sp_configure ‘show advanced options‘, 0

-----------------------------------------------------------------------------------------------

CREATE proc [dbo].reclaimmemory  --强制释放内存
 
as

begin
 
 DBCC FREEPROCCACHE 
 DBCC FREESESSIONCACHE 
 DBCC FREESYSTEMCACHE(‘All‘) 
 DBCC DROPCLEANBUFFERS

exec sp_configure ‘max server memory‘, 256 
EXEC (‘RECONFIGURE‘ )

WAITFOR DELAY ‘00:00:05‘

EXEC  sp_configure ‘max server memory‘, 2147483647 
EXEC (‘RECONFIGURE‘ )
GO

end

--使用示例
/*

reclaimmemory
*/

时间: 2024-08-28 04:12:47

SqlServer内存释放的相关文章

sqlserver内存释放心得

SQL Server 2008 或者R2的默认内存分配是2147483647MB, 差不多算是无穷大,对于系统内存的管理策略是有多少占多少.SQLserver会把所有处理过的SQL操作缓存在内存里,这样就不用总去读硬盘了.但是如果长时间运行SQL Server, 系统内存被用的差不多,再开启其他程序就有可能会报内存不足.这时候就需要释放内存缓存啦.一般我用以下两种办法: 很简单,打开SQL Server configuration Manager,然后把SQL Server(MSSQLSERVE

仿360加速球。(实现内存释放)

FloatCircleView的实现自定义view 创建WindowManager窗体管理类管理悬浮小球和底部大窗体 MyProgreeView手机底部窗体中小球的实现 FloatMenuView的实现 MyFloatService MainActivity的实现 现在手机上的悬浮窗应用越来越多,对用户来说,最常见的悬浮窗应用就是安全软件的悬浮小控件,拿360卫士来说,当开启悬浮窗时,它是一个小球,小球可以拖动,当点击小球出现大窗体控件,可以进行进一步的操作如:释放手机内存等等.于是借着慕课网的

zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports System.Runtime.InteropServices Marshal.ReleaseComObject(COM物件)COM 物件 = Nothing 方法二 :COM 物件 = NothingGC.Collect()GC.WaitForPendingFinalizers() 方法三 :Import

linux内存释放

linux内存释放一.执行sync 命令强制吧内存中的数据刷到硬盘.二.执行 echo "1" > /proc/sys/vm/drop_caches  释放pagecache的内存三.可以关掉 echo "0" > /proc/sys/vm/drop_caches

js的内存释放初步理解

1.堆内存:定义对象或函数,首先都会开一个堆内存且有一个引用地址,如果有变量知道了这个引用地址,我们就说该堆内存被占用了,不能被销毁 2.堆内存释放或销毁:把所有知道该引用地址的变量赋值null,即没人知道该引用地址,浏览器就会在空闲的时候销毁它,也叫垃圾回收 3.栈内存:有两种类别,全局作用域和私有作用域 4.全局作用域的栈内存:页面关闭的时候,才会销毁 5.私有作用域的栈内存(只有函数执行的时候才有私有作用域): a.一般情况:函数执行会形成一个新的私有作用域,当私有作用域的代码执行完之后,

内存管理---内存释放

Linux内存释放函数之间的调用关系如下图所示 hi /*用虚拟地址进行释放*/ void free_pages(unsigned long addr, unsigned int order) { if (addr != 0) { VM_BUG_ON(!virt_addr_valid((void *)addr)); __free_pages(virt_to_page((void *)addr), order);/*具体的释放函数*/ } } void __free_pages(struct pa

JavaScript 内存释放测试

JS内部实现垃圾回收机制 无法立即释放 只要数据没有依赖关系 就会在下轮内存回收时清理 ! function () { var array = [] , count = 100*100*100*5 , time = +new Date ; while( count-- ) array.push( document.createElement('el') ) ; console.log( +new Date - time, array.length ) ; count = 100*100*100*

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

c++中指针的内存申请和内存释放问题

C++中指针在new和delete操作的时候对内存堆都做了些什么呢,以下解: 1.指针的new操作: 指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址.如: void main(){ int *p = new int(4); cout << p << endl; cout << *p << endl; } 输出为: 0x00431BF0 4 分别为分配的空间地址和地址内存放的值. 如果写为: void main(){ int *p