① sqlserver占用内存过高,清理办法
SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server 服务器内存往往会占用很高。
Sql Server运行时候的缓存:
1.数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
2.执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。
清除缓存的命令(直接执行第四个命令清除所有缓存):
DBCC FREEPROCCACHE --清除存储过程相关的缓存
DBCC FREESESSIONCACHE --会话缓存
DBCC FREESYSTEMCACHE('All') --系统缓存
DBCC DROPCLEANBUFFERS --所有缓存
注意:清除了缓存,不会释放SQL Server所占用的内存,所以需要通过修改SQL Server内存或重启SQL Server服务器来释放内存。
修改SQL Server内存:
优化:使用以下语句查找出什么语句占内存最高,针对占内存高的语句进行优化
SELECT SS.SUM_EXECUTION_COUNT,
T.TEXT,
SS.SUM_TOTAL_ELAPSED_TIME AS '总和时间',
SS.SUM_TOTAL_WORKER_TIME AS '执行耗时',
SS.SUM_TOTAL_LOGICAL_READS AS '总和逻辑读数',
SS.SUM_TOTAL_LOGICAL_WRITES AS '总和逻辑写'
FROM (SELECT S.PLAN_HANDLE,
SUM(S.EXECUTION_COUNT)SUM_EXECUTION_COUNT,
SUM(S.TOTAL_ELAPSED_TIME)SUM_TOTAL_ELAPSED_TIME,
SUM(S.TOTAL_WORKER_TIME)SUM_TOTAL_WORKER_TIME,
SUM(S.TOTAL_LOGICAL_READS)SUM_TOTAL_LOGICAL_READS,
SUM(S.TOTAL_LOGICAL_WRITES)SUM_TOTAL_LOGICAL_WRITES
FROM SYS.DM_EXEC_QUERY_STATS S
GROUP BY S.PLAN_HANDLE
) AS SS
CROSS APPLY SYS.dm_exec_sql_text(SS.PLAN_HANDLE)T
ORDER BY SUM_TOTAL_LOGICAL_READS DESC
转自: https://www.cnblogs.com/LuoEast/p/8398406.html
② sqlserver 数据库优化。
优化Microsoft SQL Server数据库内存配置
内存是影响Microsoft SQL Server系统性能的一个重要因素,SQL Server数据库安装
时将为具有32MB物理内存的机器缺省配置16MB可用内存,16MB物理内存的机器缺省配置4MB可
用内存。应在Microsoft SQL Server数据库安装后进行内存选项(Memory)设置,最大配置值为
为了确定SQL Server系统最适宜的内存需求,可以从总的物理内存中减去Windows
NT4.0需要的内存以及其它一些内存需求后综合确定,理想的情况是给SQL Server分配尽可能
1?根据物理内存合理规划SQL Server可用内存
在大多数的生产环境中,服务器配备的物理内存是64MB~128MB,偶尔也有256MB的,
只要配置恰当是完全可以满足SQL Server的内存需求的。下表是笔者关于SQL Server内存分配
物理内存 分配给SQL Server 设置值(单位:2KB)
8MB 4MB 2048
16MB 8MB 4096
32MB 16~18MB 8192~9216
48MB 28~34MB 14336~17408
64MB 40~46MB 20480~23552
128MB 100~108MB 51200~55296
256MB 216~226MB 110592~115712
512MB 464~472MB 237568~241664
以下是SQL Server内存选项(Memory)设置方法
(1)从Microsoft SQL Server程序集中启动SQL Enterprise Manager;
(2)从Server Manager窗口中选择“Server”菜单选项;
(3)在“Server”菜单中选择“Configurations”选项;
(4)在“Server Configuration”对话框中选择”Configuration”标签,
(5)选中“Memory”项目,在“Current”栏填入新值;
(6)停止并重新启动SQLServer服务,使设置生效。
2?合理扩充虚拟内存、增大SQL Server可用内存
当SQL Server系统确实需要扩大可用内存时,应在磁盘空间充足的情况下扩充供虚拟
内存,并相应增大 SQL Server可用内存。具体做法是,系统管理员首先扩充服务器的虚拟内
存,然后再参考上表增大SQL Server可用内存,关键是要根据系统的负载情况综合决定是否扩
3?使用tempinRAM
SQL Server使用tempdb临时数据库作为一些查询连接操作时排序或创建临时表的工作
空间。将tempdb创建在RAM中可以使系统操作性能有较大提高,而且因为tempdb在每次重启动
服务器时都重建,这样即使有非正常的关闭也是较为安全的,例如停电故障。要将tempdb创建
在RAM中,可以使用sp_configure进行设置,具体用法请参阅有关资料。
由于tempdbinRAM使用的内存是由系统从内存体单独分配的,与SQL Server的内存选
项设置的可用内存池是分开的,使用tempdbin RAM将减少整个系统的可用内存,应根据SQL
Server和服务器运行情况进行配置,否则就可能适得其反,影响系统性能。另外,适当增加
tempdb数据库空间,即使不使用tempdbin RAM,也可以提高数据库的运行速度。
4?注意事项
(1)建议在生产环境中SQL Server不要设置小于32MB内存,而且数据库服务器上尽量
(2)扩充供虚拟内存、增大SQL Server可用内存,应考虑物理内存使用状况和磁盘空
(3)在可能的情况下,要为系统留有部分额外的内存,这样在服务器上打开一个服务
或添加一个进程且不改变SQL Server内存配置时,不致于使NT服务器的运行速度受到影响(变
得很慢),一般认为最小为2MB最大为20MB。
请采纳答案,支持我一下。
③ 揭秘SQL Server 2014有哪些新特性
1、内存数据库
在传统的数据库表中,由于磁盘的物理结构限制,表和索引的结构为B-Tree,这就使得该类索引在大并发的OLTP环境中显得非常乏力,虽然有很多办法来解决这类问题,比如说乐观并发控制,应用程序缓存,分布式等。但成本依然会略高。而随着这些年硬件的发展,现在服务器拥有几百G内存并不罕见,此外由于NUMA架构的成熟,也消除了多CPU访问内存的瓶颈问题,因此内存数据库得以出现。
内存的学名叫做RandomAccess Memory(RAM),因此如其特性一样,是随机访问的,因此对于内存,对应的数据结构也会是Hash-Index,而并发的隔离方式也对应的变成了MVCC,因此内存数据库可以在同样的硬件资源下,Handle更多的并发和请求,并且不会被锁阻塞,而SQLServer 2014集成了这个强大的功能,并不像Oracle的TimesTen需要额外付费,因此结合SSDAS Buffer Pool特性,所产生的效果将会非常值得期待。
SQLServer内存数据库的表现形式
在SQL Server的Hekaton引擎由两部分组成:内存优化表和本地编译存储过程。虽然Hekaton集成进了关系数据库引擎,但访问他们的方法对于客户端是透明的,这也意味着从客户端应用程序的角度来看,并不会知道Hekaton引擎的存在。如图1所示。
图8.内存优化表+本地编译存储过程
因此不难看出,内存优化表+本地编译存储过程有接近几十倍的性能提升。
④ SQL Server占用内存过高,什么原因导致的,用什么方法可以解决
经常使用MSSQL的朋友都会发现一个小小的网站在运行若干天后MSSQL就会把服务器上所有的内存都吃光,此时你不得不重新启动一下服务器或mssql来释放内存,有人认为是 MSSQL有内存泄露问题,其实不然,微软给我们了明确说明:在您启动SQL Server 之后,SQL Server内存使用量将会持续稳定上升,即使当服务器上活动很少时也不会下降。另外,任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降,直到可用内存降到 4 至 10 MB 为止。
仅仅出现这种状态不表示内存泄漏。此行为是正常的,并且是 SQL Server 缓冲池的预期行为。
默认情况下,SQL Server 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),SQL Server缓冲池就会继续增大。像在与SQL Server 分配内存位于相同计算机上的其他进程一样,SQL Server 缓冲区管理器将在需要的时候释放内存。SQL Server每秒可以释放和获取几兆字节的内存,从而使它可以快速适应内存分配变化。
更多信息
您可以通过服务器内存最小值和服务器内存最大值配置选项设置 SQL Server数据库引擎使用的内存(缓冲池)量的上下限。在设置服务器内存最小值和服务器内存最大值选项之前,请查阅以下 Microsoft 知识库文章中标题为'内存'一节中的参考信息:319942 HOW TO:Determine Proper sql server(WINDOWS平台上强大的数据库平台) Configuration Settings(确定正确的 sql server(WINDOWS平台上强大的数据库平台) 配置设置)
请注意,服务器内存最大值选项只限制 SQL Server 缓冲池的大小。服务器内存最大值选项不限制剩余的未保留内存区域,sql server(WINDOWS平台上强大的数据库平台) 准备将该区域分配给其他组件,例如扩展存储过程、COM 对象、以及非共享 DLL、EXE 和 MAPI 组件。由于前面的分配SQL Server专用字节超过服务器内存最大值配置是很正常的。有关此未保留内存区域中分配的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:316749 PRB:在使用大量数据库时可能没有足够的虚拟内存
下面我们就来实战如何限制MSSQL内存使用:
第一步:打开企业管理器双击进入要修改的MSSQL.
第二步:在左侧MSSQL上点击右键,选择属性,弹出SQL Server属性(配置)对话框(最好打上SQL SP4补丁)
第三步:点击内存选项卡. 在这里,你会看到MSSQL默认设置为使用最大内存,也就是你所有的内存,根据你的需要,设置它的最大值(一般为物理内存-128M)和最小值(一般为最大内存的1/4)吧.
第五步:设置完毕,重启MSSQL服务,配置即可生效!
⑤ 如何解决SQLServer占内存过多的问题
我们需要准备的材料分别是:电脑。
1、在我的电脑中,搜索访问sql占用内存,在右侧的管理服务器中选择重新启动,重启一下IIS。
⑥ 如何对sqlserver进行简单的优化
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是数据库设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化
●可以通过以下方法来优化查询 :
1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3、升级硬件
4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。
⑦ 如何优化ms server 2008 r2 的内存释放
SQL Server 2008 或者R2的默认内存分配是2147483647MB, 差不多算是无穷大,对于系统内存的管理策略是有多少占多少。SQLserver会把所有处理过的SQL操作缓存在内存里,这样就不用总去读硬盘了。但是如果长时间运行SQL Server, 系统内存被用的差不多,再开启其他程序就有可能会报内存不足。这时候就需要释放内存缓存啦。一般我用以下两种办法:
很简单,打开SQL Server configuration Manager,然后把SQL Server(MSSQLSERVER)重启一下,一般默认的instance 就是MSSQLServer,当然你如果装了其他的instance(实例)就选择相应的,例如MSSQLServer(SQLServLatin1), MSSQLServer(ARABIC)。
这种方法最简单有效,但是只能临时的清除SQLServer缓存所占的内存空间,时间长了SQLServer还会把内存占满。而且很重要的是这种方法不能在SQLserver有连接的情况下使用,那样会让正在使用SQLServer的用户暂时无法连接SQLServer,甚至导致程序处错误。而你作为管理员就……
第二种方法比较复杂,我也不是SQLServer高手,只是从网上学习得来的一些query:
DBCC FREEPROCCACHE
DBCC FREESESSIONCACHE
DBCC FREESYSTEMCACHE('All')
DBCC DROPCLEANBUFFERS
以上一段一般能释放缓存,(注意引号有的时候因为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
其实我用这几句也不是很奏效,时间一长还是可能会有内存不够的情况。
******
总的来说我的管理办法是:
装好了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
过一段时间觉得不行了就执行一下
DBCC FREEPROCCACHE
DBCC FREESESSIONCACHE
DBCC FREESYSTEMCACHE('All')
DBCC DROPCLEANBUFFERS
这个清缓存也很头疼,不知道什么时候合适,就这样吧,管他呢,我又不是专家,出了问题大不了来机器不行。或者写个Procere,用job定期执行。
没办法,SQLServer太霸道了,以上方法不是万全之策,建议还是把SQLServer放到一边单独用吧。
⑧ sqlserver 内存优化表 是把所有数据放在内存吗
一个内存优化表可以是持久的或非持久的。 (1)对于一个持久表是将数据存储在内存中,而且也保存在内存优化文件组中。 (2)对于一个非持久表,数据是仅存储在内存中的,所以,如果系统崩溃或重启,数据就会丢失。
⑨ 如何释放Sqlserver所占用的内存
sql server 在查询大数据量的数据时,总会占用大量的内存,并且居高不下,一不小心就会死机。
下面这个是我从网上找到的:
当你查询数据的数据量比较大时,sqlserver会把查询结果缓存在内存中,保证你下次查询同样的记录时会很快得到结果,所以内存使用量会激增。
在你完成此次查询后,sqlserver不会马上释放内存,数据会仍然放在内存中,这是sqlserver的优化策略,sqlserver会不断地占用你的系统内存,来加快sqlserver的运行速度,当你的系统中的其它服务也需要内存时,它才会自动释放部分内存。一句话,sqlserver不会让你的系统有闲置的内存,除非你设置sqlserver的最大内存使用量。这样也没什么不好,如果你的系统很大,单独给sqlserver一台机器,这样会提高它的性能。
如果你只是开发用,要想让sqlserver释放内存,重启sqlserver的服务就行了。如果不想让sqlserver占用太多内存,设置sqlserver的最大内存占用量.
设置最大内存后效果好了不少!