SqlServer系统内存管理在没有配置内存最大值,很多时候我们会发现运行SqlServer的系统内存往往居高不下。这是由于他对于内存使用的策略是有多少闲置的内存就占用多少,直到内存使用虑达到系统峰值时(预留内存根据系统默认预留使用为准,至少4M),才会清除一些缓存释放少量的内存为新的缓存腾出空间。
这些内存一般都是SqlServer运行时候用作缓存的,例如你运行一个select语句,执行个存储过程,调用函数;
1.数据缓存:执行个查询语句,SqlServer会将相关的数据页(SqlServer操作的数据都是以页为单位的)加载到内存中来,下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
2.执行命令缓存:在执行存储过程,自定函数时,SqlServer需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。
在我们执行完相应的查询语句,或存储过程,如果我们不在需要这些缓存,我可以将它清除,DBCC管理命令缓存清除如下:
--清除存储过程缓存
DBCCFREEPROCCACHE
--注:方便记住关键字FREEPROCCACHE可以拆解成FREE(割舍,清除)PROC(存储过程关键字简写),CACHE(缓存)
--清除会话缓存
DBCCFREESESSIONCACHE
--注:FREE(割舍,清除)SESSION(会话)CACHE(缓存)
--清除系统缓存
DBCCFREESYSTEMCACHE('All')
--注:FREESYSTEMCACHE
--清除所有缓存
DBCCDROPCLEANBUFFERS
--注:DROPCLEANBUFFERS
‘贰’ sql server 2000最大高速缓存是多少
默认是 1.6G
如果操作系统是企业版 的, SQL SERVER 是企业版或者是DATA CENTER 就可以支持大内存,需要开启SQL SERVER的AWE选项
AWE选项允许SQL SERVER使用 大内存。
配置操作系统支持AWE
要使OS支持AWE,必须在boot.ini 中加入 /pae 参数
锁定内存页:要使用AWE,启动SQLServer服务的帐号必须有内存中锁定页Lock Page in Memory的权限
此策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统将数据分页到磁盘的虚拟内存中。
在 SQL Server 2005 中,“锁定内存页”选项默认设置为 OFF。如果您具有系统管理员权限,
则可以使用组策略工具 (gpedit.msc) 手动启用该选项,并将此权限指定给正在运行 SQL Server 的帐户。
开启SQL SERVER的AWE选项.gpedit.msc->计算机配置->WINDOWS设置->安全设置->
本地策略->用户权限分配->内存中锁定页面->加入SQL SERVER的启动帐户
虽然没有要求,但我们建议在使用 64 位操作系统时锁定内存中的页。
对于 32 位操作系统,在将 AWE 配置为用于 SQL Server 之前,必须授予“锁定内存页”权限。
/*开启SQL SERVER的AWE,并设置最大内存为5G
sp_configure "show advanced options", 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure "awe enabled", 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure "max server memory", 5120
RECONFIGURE WITH OVERRIDE
GO
*/
设置最大内存要参照系统物理内存,留下一下内存以供其它应用程序使用(如系统是8G内存,SQL可设置为5G)。设置好后重启服务器即可。
‘叁’ 如何减少分页缓冲池内存在 SQL Server 的 64 位版本
您可以通过锁定为在物理内存中的缓冲区池分配的内存分页缓冲池内存的 SQL Server 进程出的防止 Windows 操作系统。您可以通过在内存中的锁定页用户将权限分配给用户帐户用作 SQL Server 服务的启动帐户锁定内存。
注意对于 SQL Server 的 64 位版本,只有 SQL Server 企业版可以使用内存中的锁定页用户权限。这是适用于 SQLServer 2005 [RTM SP1,SP2,SP3] 和 [RTM 和 SP1] 的 SQL Server 2008年。SQL Server 2008 SP1 累积更新 2 和 SQL服务器 2005 SP3 累积更新 4 引入了对 SQL Server 标准版以使用锁定在内存中的页的用户权限的支持。 在 64 位系统上支持锁定页面的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
970070 锁定页支持 SQL Server 2005 标准版 64 位系统上,并在 SQL Server 2008年标准版 64 位系统上
若要分配的内存中的锁定页的用户权限,请执行以下步骤:
单击开始,然后单击运行,类型 gpedit.msc然后单击确定。
注意组策略对话框。
展开ComputerConfiguration,然后再展开Windows 设置。
展开安全设置,然后展开本地策略。
单击用户权限分配中,,然后双击锁定页 inmemory。
在本地安全策略设置对话框中,单击添加用户或组。
在选择用户或组对话框中,将该帐户有权运行 Sqlservr.exe 文件中,添加,然后单击确定。
关闭组策略对话框。
重新启动 SQL Server 服务。
分配后内存中的锁定页用户权限,并且在重新启动 SQL Server 服务,Windows 操作系统不再出在 SQL Server 中的缓冲池内存的页处理。但是,Windows 操作系统可以仍然出在 SQL Server 进程内的 nonbuffer 池内存页。
您可以验证用户权限使用 SQL Server 的实例,应确保在启动 SQL Server 错误日志中写入以下的消息:
将锁定的页用于缓冲池
‘肆’ sqlserver2005怎么设置内存
SQLSERVER的内存用在哪里?
SQL会缓存大量的数据页面,他还会缓存很多其他信息,包括存储过程的执行计划 ,特定用户的安全上下文等
如果这些信息没有在数据库中缓存,SQL都要重新计算一遍,花额外的时间,所以SQLSERVER对内存的需求是十分强烈的。
配置:
(1)如果服务器支持64位操作系统,没有特殊理由的话,请安装64位系统。这样SQL能够有效地使用 大于2GB的内存。如果一定要用32位系统,务必将SQLSERVER服务器属性里面的“使用AWE分配内存”打开。但是不要用boot.ini文件里的/3GB这个开关,即不要在boot.ini文件里加上/3GB这个参数。
(2)尽量使服务器专门供数据库使用,不要将其他服务(例如IIS,中间层应用服务等)安装在同一台机器上。多个生产应用服务在同一台机器上运行,会大大增加维护成本
(3)建议设置SQLSERVER max server memory(最大服务器内存),以确保Windows有足够的内存供系统本身使用。
情况归纳如下:
一台4GB机器,建议预留1GB,设置SQLSERVER max server memory为2.8GB
一台8GB机器,建议预留2GB,设置SQLSERVER max server memory为6GB
一台大于8GB的64位机器,建议预留3GB~4GB
如果一台服务器上还有其他应用使用内存,也要扣除他们的内存使用数
一般设置SQLSERVER min server memory(最小服务器内存)意义不大
(4)如果是企业版SQLSERVER,建议赋给SQLSERVER启动帐号lock page in memory的权限
设置方法如下:
打开组策略(运行 ,输入gpedit.msc)-》找到计算机配置-》Windows设置-》安全设置-》本地策略-》用户权限分配-》锁定内存页
在锁定内存页上右键,打开锁定内存页属性,添加SQLSERVER启动帐号进去
(5)“set working set size” 这个SQLSERVER参数在现在的Windows上不能起到固定SQL物理内存的作用,所以请永远不要使用
修改完配置之后需要重启SQLSERVER服务才能生效!!!!!
除了配置之外还有一些应对内存错误的其他一些建议:
升级Windows2003到SP2,或者使用Windows2008 ,这些版本的Windows的内存管理机制有了调整
升级硬件驱动程序,或者联系微软技术服务,帮忙检查是不是硬件方面问题引起
‘伍’ 为什么读取SQL的数据库会占用内存那么大
因为SQL使用了缓存技术,所以在使用一段时间以后内存占用会越来越多。
打开企业管理器,在你的SQL服务器上点右键,查看属性。
在“内存”项中把内存的“最大值”改小一点,不要超过你的内存的一半,或者选中“使用固定的内存大小”,然后将值设定为你内存的一半也可以。
‘陆’ 如何将SQL Server表驻留内存和检测
1、DBCCPINTABLE 不会导致将表读入到内存中。当表中的页由普通的 Transact-SQL 语句读入到高速缓存中时,这些页将标记为内存驻留页。当 SQL Server 需要空间以读入新页时,不会清空内存驻留页。SQL Server 仍然
记录对页的更新,并且如有必要,将更新的页写回到磁盘。然而,在使用 DBCC UNPINTABLE 语句使该表不驻留之前
,SQL Server 在高速缓存中一直保存可用页的复本。
DBCC PINTABLE 最适用于将小的、经常引用的表保存在内存中。将小表的页一次性读入到内存中,将来对其数据的所有引用都不需要从磁盘读入。
注意 DBCC PINTABLE 可以提供性能改进,但是使用时务必小心。如果驻留大表,则该表在开始时会使用一大部分高速缓存,而不为系统中的其它表保留足够的高速缓存。如果所驻留的表比高速缓存大,
则该表会填满整个高速缓存。sysadmin 固定服务器角色的某个成员必须关闭而后重新启动 SQL Server,然后使表不驻留。
驻留太多的表和驻留比高速缓存大的表会产生同样的问题。
示例:
Declare@db_idint,@tbl_idint
UseDATABASE_NAME
Set@db_id=DB_ID('DATABASE_NAME')
Set@tbl_id=Object_ID('Department')
DBCCpintable(@db_id,@tbl_id)
可将表Department设置为驻留内存。
Declare@db_idint,@tbl_idint
UseDATABASE_NAME
Set@db_id=DB_ID('DATABASE_NAME')
Set@tbl_id=Object_ID('Department')
DBCCUNpintable(@db_id,@tbl_id)
可将表Department取消设置为驻留内存。
可以使用如下的SQL指令来检测执行情况:
SelectObjectProperty(Object_ID('Department'),'TableIsPinned')
如果返回结果为1:则表示该表已经设置为驻留内存;0:则表示没有设置为驻留内存。
2, SP_TableOption
设置用户定义表祥余伏的选项值。sp_tableoption可以用来打开桌上的文本,在文本行特征ntext或image列。
语法毁宽
sp_tableoption [ @TableNamePattern = ] 'table'
, [ @OptionName = ] 'option_name'
, [ @OptionValue = ] 'value'
其中,'option_name' 有如下用法:
pintable -- 默认,它标志着该表不再内存居民。启用时,将表标记为内存驻留(可将指谨携定的表驻留内存)
另外,table lock on bulk load, insert row lock, text in row等等可选值,因不涉及将表驻留内存,具体用法可以查询SQL Server Books Online.
Value有如下用法:
the option_name is enabled (true, on, or 1) or disabled (false, off, or 0)
示例:
EXECsp_tableoption'Department','pintable','true'
将数据表Department驻留内存
EXECsp_tableoption'Department','pintable','false'
取消数据表Department驻留内存
可以使用如下的SQL指令来检测执行情况:
SelectObjectProperty(Object_ID('Department'),'TableIsPinned')
如果返回结果为1:则表示该表已经设置为驻留内存;0:则表示没有设置为驻留内存。
3. Conclusions
将数据表设置为驻留内存时,并没有实际将表读入内存中,直到该表从被检索。因此,可以使用如下SQL指令进一步将数据表Department驻留内存:
Select*FromDepartment
另外,可以使用如下SQL指令方便显示/检测数据库Database中所有设置为驻留内存的表:
SELECT*FROMINFORMATION_SCHEMA.Tables
WHERETABLE_TYPE='BASETABLE'
ANDOBJECTPROPERTY(object_id(TABLE_NAME),'TableIsPinned')>0
‘柒’ 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
‘捌’ sql server 2015一般需要多少内存
默认情况下,SQL Server 会依据可获得的系统资源动态改变它的内存需求。如果 SQL Server 需要更多的内存,它会要求操作系统确定是否有空闲的物理内存可用,并使用可用的内存。若 SQL Server 不再需要当前分配给它的内存,它就将内存释放给操作系统。当 SQL Server 动态使用内存时,它要求系统定期地检测可用的物理内存数量。SQL Server 根据服务器活动增大或收缩高速缓冲存储器,以使可用物理内存保持在 4 MB 到 10 MB 之间。这就避免了系统进行换页操作。 [也就是说,这种情况下SQL SERVER 本身不会使物理可用内存小于4M,如果比较长的时间内都小于4M的话,则要看一下是不是该服务器上其它应用程序有问题] 第二种情况:限制使用内存 使用 set working set size 为sql server保留等于服务器内存设置的物理内存空间。即使是sql server 进程此时是空闲的,系统也不会将 SQL Server 页交换出去。 使用min server memory 保证sql server 使用的最小内存。SQL Server 启动时不立即分配 min server memory 中所指定的内存量。但是,当内存使用由于客户端负荷而达到该值后,SQL Server 将无法从已分配的缓冲池中释放内存。 使用max server memory 则防止 SQL Server 使用多于指定数量的内存,这样剩余的可用内存可以快速运行其它应用程序。SQL Server 启动时不立即分配 max server memory 中所指定的内存。内存使用随 SQL Server 的需要而增长,直到达到 max server memory 中所指定的值。SQL Server 无法超过该内存使用值,除非增加 max server memory 值。 第一种情况比较适用于服务器专做sql server服务器的情况,第二种情况适用于为在同一台计算机上运行的其它应用程序保留一定的内存以便于快速响应。(另:如果想动态分配sql server 的内存,则不要设置set working set size 选项,使用默认值即可。至于这些参数如何设置参见另外的文档) 监视 SQL Server 所使用的内存和计数器有助于确定: 是否由于缺少可用物理内存存储高速缓存中经常访问的数据而导致瓶颈存在。如果是这样,SQL Server 必须从磁盘检索数据。 是否可通过添加更多内存或使更多内存可用于数据高速缓存或 SQL Server 内部结构来提高查询性能。 SQL Server 需要从磁盘读取数据的频率。与其它操作相比,例如内存访问,物理 I/O 会耗费大量时间。尽可能减少物理 I/O 可以提高查询性能。 对sql server服务器内存的监视: Memory:Available Bytes 计数器表示当前进程可使用的物理内存字节数。 如果小于4M或更小,说明计算机上总的内存可能不足,或某个程序没有释放内存 ● Memory: Page Faults / sec 每秒软性页面失效的数目(包括有些可以直接在内存中满足而有些需要从硬盘读取)较page/sec只表明数据不能在内存指定工作集中立即使用。 如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内 存可能是瓶颈。 Memory:Pages/sec 计数器表示由于缺页处理而从磁盘取回的页数,或由于缺页处理而写入磁盘以释放工作集空间的页数。 ● Page Reads/sec 每秒发出的物理数据库页读取数。这一统计信息显示的是在所有数据库间的物理页读取总数。由于物理 I/O 的开销大,可以通过使用更大的数据高速缓存、智能索引、更高效的查询或者改变数据库设计等方法,使开销减到最小。 ● Page Writes/sec 所发出的物理数据库页写入的数目。