重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
sql server 在查询大数据量的数据时,总会占用大量的内存,并且居高不下,一不小心就会死机。
10多年专注成都网站制作,企业网站设计,个人网站制作服务,为大家分享网站制作知识、方案,网站设计流程、步骤,成功服务上千家企业。为您提供网站建设,网站制作,网页设计及定制高端网站建设服务,专注于企业网站设计,高端网页制作,对隧道混凝土搅拌车等多个行业,拥有多年的网站推广经验。
下面这个是我从网上找到的:
当你查询数据的数据量比较大时,sqlserver会把查询结果缓存在内存中,保证你下次查询同样的记录时会很快得到结果,所以内存使用量会激增。
在你完成此次查询后,sqlserver不会马上释放内存,数据会仍然放在内存中,这是sqlserver的优化策略,sqlserver会不断地占用你的系统内存,来加快sqlserver的运行速度,当你的系统中的其它服务也需要内存时,它才会自动释放部分内存。一句话,sqlserver不会让你的系统有闲置的内存,除非你设置sqlserver的最大内存使用量。这样也没什么不好,如果你的系统很大,单独给sqlserver一台机器,这样会提高它的性能。
如果你只是开发用,要想让sqlserver释放内存,重启sqlserver的服务就行了。如果不想让sqlserver占用太多内存,设置sqlserver的最大内存占用量.
设置最大内存后效果好了不少!
数据缓存和执行缓存的控制。
SQLServer占用的内存主要由三部分组成:数据缓存(DataBuffer)、执行缓存(ProcedureCache)、以及SQLServer引擎程序。SQLServer引擎程序所占用缓存一般相对变化不大,则我们进行内存调优的主要着眼点在数据缓存和执行缓存的控制上。
SQL语句在执行前首先将被编译并通过查询优化引擎进行优化,从而得到优化后的执行计划,然后按照执行计划被执行。对于整体相似、仅仅是参数不同的SQL语句,SQLServer可以重用执行计划。但对于不同的SQL语句,SQLServer并不能重复使用以前的执行计划,而是需要重新编译出一个新的执行计划。同时,SQLServer在内存足够使用的情况下,此时并不主动清除以前保存的查询计划。这样,不同的SQL语句执行方式,就将会大大影响SQLServer中存储的查询计划数目。如果限定了SQLServer最大可用内存,则过多无用的执行计划占用,将导致SQLServer可用内存减少,从而在执行查询时尤其是大的查询时与磁盘发生更多的内存页交换。如果没有限定最大可用内存,则SQLServer由于可用内存减少,从而会占用更多内存。
开始-程序-sql server 2005-sql server configuration mananger-sqlexpress协议-双击右侧的TCP/IP协议
如何查看磁盘I/O操作信息
SET
STATISTICS
IO
ON
命令是一个
使
SQL
Server
显示有关由
Transact-SQL
语句生成的磁盘活动量的信息。
我们在分析索引性能的时候,会非常有用。
启用了这个属性后,我们在执行
SQL
语句后,会收到类似如下的信息,这有利于我们分析SQL的性能:
(3999
row(s)
affected)
表
'ChargeCL'。扫描计数
1,逻辑读取
9547
次,物理读取
次,预读
次,lob
逻辑读取
次,lob
物理读取
次,lob
预读
次。
其中的
lob
逻辑读取、lob
物理读取、lob
预读
这三个指标是
读取
text、ntext、image
或大值类型
(varchar(max)、nvarchar(max)、varbinary(max))
时的指标。
而
逻辑读取、物理读取、预读
是对普通数据页的读取。
使用
SQL
Server
Management
Studio
Standard
Reports
我们在
SQL
Server
Management
Studio
中,选择数据库服务器,或者具体数据库,或者Security
--
Logins
时,或者Management
时,Notification
Services
或者
SQL
Server
Agent
对象时候,都会看到SQL
Server
替我们提供的一些现成报表,这些报表的数据,有利于我们分析数据库的状态。
比如在
SQL
Server
索引基础知识(1)---
记录数据的基本格式
中,我们就使用数据表占用空间的报表
具体报表可以参考以下链接:
SQL
Server
Management
Studio
Standard
Reports
-
Overview
测试中,释放缓存的一些方法
尤其查询语句性能测试时,数据是否被缓存,这是测试中一个重要点。下面几个命令帮助我们清除缓存。方便测试。
清除缓存有关的命令:
SQL
2000里面除了dbcc
unpintable好像就没有了
而且这个操作也不会立即释放表内存Buffer
(DBCC
UNPINTABLE
does
not
cause
the
table
to
be
immediately
flushed
from
the
data
cache.
It
specifies
that
all
of
the
pages
for
the
table
in
the
buffer
cache
can
be
flushed
if
space
is
needed
to
read
in
a
new
page
from
disk.)
SQL
2005/2008让DBA能够更自由的对SQL所占用的内存空间做处理
如:
CHECKPOINT
将当前数据库的全部脏页写入磁盘。“脏页”是已输入缓存区高速缓存且已修改但尚未写入磁盘的数据页。CHECKPOINT
可创建一个检查点,在该点保证全部脏页都已写入磁盘,从而在以后的恢复过程中节省时间。
DBCC
DROPCLEANBUFFERS
从缓冲池中删除所有清除缓冲区。
DBCC
FREEPROCCACHE
从过程缓存中删除所有元素。
DBCC
FREESYSTEMCACHE
从所有缓存中释放所有未使用的缓存条目。SQL
Server
2005
数据库引擎会事先在后台清理未使用的缓存条目,以使内存可用于当前条目。但是,可以使用此命令从所有缓存中手动删除未使用的条目。
另外还可以
sp_cursor_list
查看全部游标
DBCC
OPENTRAN查看数据库打开事务状态等
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
这个清缓存也很头疼,不知道什么时候合适,就这样吧,管他呢,我又不是专家,出了问题大不了来机器不行。或者写个Procedure,用job定期执行。
没办法,SQLServer太霸道了,以上方法不是万全之策,建议还是把SQLServer放到一边单独用吧。