`

sqlserver内存释放心得

 
阅读更多

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

 

 



 

  mssqlserver 2005也是最大  2147483647MB

  1. 很简单,打开SQL Server configuration Manager,然后把SQL Server(MSSQLSERVER)重启一下,一般默认的instance 就是MSSQLServer,当然你如果装了其他的instance(实例)就选择相应的,例如MSSQLServer(SQLServLatin1), MSSQLServer(ARABIC)。

这种方法最简单有效,但是只能临时的清除SQLServer缓存所占的内存空间,时间长了SQLServer还会把内存占满。而且很重要的是这种方法不能在SQLserver有连接的情况下使用,那样会让正在使用SQLServer的用户暂时无法连接SQLServer,甚至导致程序处错误。而你作为管理员就……

 

net stop mssqlserver        net  start  mssqlserver

 

 

 

  1. 第二种方法比较复杂,我也不是SQLServer高手,只是从网上学习得来的一些query:

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
 
*/

以上一段一般能释放缓存,(注意引号有的时候因为word文档里打不出英文的引号,最好拷到记事本里编辑一下)但是有的时候不是很管用。因为SQLserver不会因为Cache(缓存)释放了而释放内存,占了茅坑不一定XX。此命令只会让SQLServer不会继续占领新的内存,定期执行一下还可以。关键是还要释放一下内存。

通过以下Query 可以看出当前服务器所占内存情况

SELECT * FROM sys.dm_os_performance_counters

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

Target Server Memory(KB)和 Total Server Memory(KB)字面意思所得就是目标和当前SQL Server所占的内存大小。

EXEC sp_configure 'show advanced options', 1

GO

EXEC sp_configure 'max server memory', 256

EXEC ('RECONFIGURE' )

WAITFOR DELAY '00:00:05'

EXEC  sp_configure 'max server memory', 2147483647

EXEC ('RECONFIGURE' )

GO

EXEC sp_configure 'show advanced options', 0

GO

其实我用这几句也不是很奏效,时间一长还是可能会有内存不够的情况。

 

******

总的来说我的管理办法是:

  1. 装好了SQLServer之后立刻设置最大使用内存

 

EXEC sp_configure 'show advanced options', 1 -- 这句是打开advanced options

GO

EXEC sp_configure 'max server memory', 9216 -- 设置最大内存为9G,我们server 内存是16G的,留下7G足够了

EXEC ('RECONFIGURE' )

GO

EXEC sp_configure 'show advanced options', 0 --记得用完了把advanced options关掉

GO

  1. 过一段时间觉得不行了就执行一下

DBCC FREEPROCCACHE

DBCC FREESESSIONCACHE

DBCC FREESYSTEMCACHE('All')

DBCC DROPCLEANBUFFERS

这个清缓存也很头疼,不知道什么时候合适,就这样吧,管他呢,我又不是专家,出了问题大不了来机器不行。或者写个Procedure,用job定期执行。

没办法,SQLServer太霸道了,以上方法不是万全之策,建议还是把SQLServer放到一边单独用吧。

 



 

 

 最后点击“确定”按钮就可以了!

 

 

 

http://www.cnblogs.com/lyhabc/articles/3219639.html

  • 大小: 163.8 KB
  • 大小: 37.8 KB
  • 大小: 101.2 KB
  • 大小: 101.2 KB
分享到:
评论

相关推荐

    sqlserver内存释放

    ### SQL Server 内存管理与释放机制详解 #### 一、SQL Server 内存管理概述 SQL Server 是一款高性能的关系型数据库管理系统,在处理大量数据时能够实现高效的查询响应时间。为了提高性能,SQL Server 会尽可能地...

    SQL Server数据库占用过多内存的解决方法

    通过对SQL Server内存使用机制的理解,我们可以采取多种措施来优化内存管理和查询性能。合理配置最大内存使用量、优化查询策略、合理使用索引等方法可以帮助我们有效控制SQL Server的内存占用,并提高整体系统的性能...

    SSM框架druid连接池,sql server数据库

    3. **内存泄露**:确保在关闭数据库连接时正确释放资源,避免因未关闭Statement或ResultSet导致的内存泄露。 在你提到的博客园经历中,如果遇到了问题并扣分,建议你在提问或分享经验时,详细描述遇到的问题、错误...

    第二次实验1

    在实验开始前,需要在Windows控制面板的ODBC数据源管理器中创建一个新的数据源,确保它能连接到SQL Server服务器。数据源的名称应与程序中引用的一致。实验内容要求编写一个C语言程序,利用ODBC API函数进行数据库...

    MSSQL 游标使用 心得

    游标在SQL Server中是一种非常重要的工具,它允许开发者按行处理数据,而非一次性处理整个结果集。在处理大量数据时,特别是在需要逐行检查、修改或操作数据的情况下,游标显得尤为有用。以下是对MSSQL游标使用的...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用程序 22.7.3 宿主如何拿回它的线程 第23章 程序集加载和...

    CLR.via.C#.(中文第3版)(自制详细书签)

    22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用程序 22.7.3 宿主如何拿回它的线程 第23章 程序集加载和反射...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用程序 22.7.3 宿主如何拿回它的线程 第23章 程序集加载和...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    22.6.4 Microsoft SQL Server 22.6.5 更多的用法只局限于你自己的想象力 22.7 高级宿主控制 22.7.1 使用托管代码管理CLR 22.7.2 编写健壮的宿主应用程序 22.7.3 宿主如何拿回它的线程 第23章 程序集加载和...

Global site tag (gtag.js) - Google Analytics