SQL Server占用内存的认识

SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer)、执行缓存(Procedure Cache)、以及SQL Server引擎程序。SQL Server引擎程序所占用缓存一般相对变化不大,则我们进行内存调优的主要着眼点在数据缓存和执行缓存的控制上.
a). 数据缓存:执行个查询语句,Sql Server会将相关的数据页(Sql Server操作的数据都是以页为单位的)加载到内存中来,下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。
b).执行命令缓存:在执行存储过程,自定函数时,Sql Server需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。
执行缓存的调优:
对于减少执行缓存的占用,主要可以通过使用参数化查询减少内存占用。
1、使用参数化查询减少执行缓存占用
分析:
SQL语句在执行前首先将被编译并通过查询优化引擎进行优化,从而得到优化后的执行计划,然后按照执行计划被执行。对于整体相似、仅仅是参数不同的SQL语句,SQL Server可以重用执行计划。但对于不同的SQL语句,SQL Server并不能重复使用以前的执行计划,而是需要重新编译出一个新的执行计划。同时,SQL Server在内存足够使用的情况下,此时并不主动清除以前保存的查询计划(注:对于长时间不再使用的查询计划,SQL Server也会定期清理)。这样,不同的SQL语句执行方式,就将会大大影响SQL Server中存储的查询计划数目。如果限定了SQL Server最大可用内存,则过多无用的执行计划占用,将导致SQL Server可用内存减少,从而在执行查询时尤其是大的查询时与磁盘发生更多的内存页交换。如果没有限定最大可用内存,则SQL Server由于可用内存减少,从而会占用更多内存。
解决措施:
我们一般可以通过两种方式实现参数化查询:一是尽可能使用存储过程执行SQL语句(这在现实中已经成为SQL Server DBA的一条原则),二是使用sp_executesql 方式执行单个SQL语句(注意不要像上面的第一个例子那样使用sp_executesql)。
2、检查并分析SQL Server执行缓存中的执行计划
要对缓存进行优化,就可以通过具体分析缓存中的执行计划,看看哪些是有用的、哪些是无用的执行计划来分析和定位问题。
通过查询DMV: sys.dm_exec_cached_plans,可以了解数据库中的缓存情况,包括被使用的次数、缓存类型、占用的内存大小等:

SELECT usecounts, cacheobjtype, objtype,size_in_bytes, plan_handle
FROM sys.dm_exec_cached_plans 

通过缓存计划的plan_handle可以查询到该执行计划详细信息,包括所对应的SQL语句:

SELECT  TOP 100 usecounts,
    objtype,
    p.size_in_bytes,
    [sql].[text]
FROM sys.dm_exec_cached_plans p
OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
ORDER BY usecounts

我们可以选择针对那些执行计划占用较大内存、而被重用次数较少的SQL语句进行重点分析。看其调用方式是否合理。另外,也可以对执行计划被重复使用次数较多的SQL语句进行分析,看其执行计划是否已经经过优化。进一步,通过对查询计划的分析,还可以根据需要找到系统中最占用IO、CPU时间、执行次数最多的一些SQL语句,然后进行相应的调优分析。

下面介绍一些清理缓存常用方法:

DBCC DROPCLEANBUFFERS        --清除数据缓存(数据)
DBCC FREEPROCCACHE        --清除存储过程缓存 (执行计划)
DBCC FREESESSIONCACHE         --清除会话缓存
DBCC FREESYSTEMCACHE(‘All‘)      --清除系统缓存  

下面提供内存查看功能的一些脚本语句:

  --内存使用情况
SELECT * FROM sys.dm_os_performance_counters
WHERE counter_name IN (‘Target Server Memory (KB)‘,‘Total Server Memory (KB)‘)   

-- 内存状态
DBCC MemoryStatus
时间: 2024-10-03 22:41:46

SQL Server占用内存的认识的相关文章

SQL Server 占用内存太高,查找占用内存高以及影响其性能的sql语句

当发现SQL Server 占用的资源过高,有时重启电脑也解决不了问题时,建议通过如下语句检查SQL语句的问题, 如果是当天出的问题增加{order by last_worker_time desc,想看一下今天哪些sql执行出现问题了} SELECT s2.dbid,  s1.sql_handle,  (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,  ( (CASE WHEN statement_end_offset

查询sql server占用内存的情况

se master go select * from sysperfinfo where counter_name like '%Total Server Memory (KB)%' go

SQL Server 2008内存及I/O性能监控

来源: it168  发布时间: 2011-04-12 11:04  阅读: 10820 次  推荐: 1   原文链接   [收藏] 以下均是针对Window 32位系统环境下,64位的不在下面描述情况下. 用户模式和内核模式(user mode& kernel mode) 为了防止用户程序访问并篡改操作系统的关键部分,Windows使用了2种处理器存取模式:用户模式和内核模式.顾名思义,内核模式是给操作系统核心代码和基本驱动用的,用户模式给用户应用程序.在内核模式下程序可以访问所有的内存和硬

浅谈SQL Server 对于内存的管理

简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级.

Performance Monitor3:监控SQL Server的内存压力

SQL Server 使用的资源受到操作系统的调度,同时,SQL Server在内部实现了一套调度算法,用于管理从操作系统获取的资源,主要是对内存和CPU资源的调度.一个好的数据库系统,必定在内存中缓存足够多的信息,以减少从物理硬盘中读取数据的次数:如果内存是系统瓶颈,那么SQL Server一定会运行的非常慢.监控SQL Server的内存压力,需要从Widnows级别上,对内存使用的整体使用情况进行监控:从SQL Server级别上,监控SQL Server对内存资源的使用情况. 一,从Wi

解决 SQL Server 耗尽内存的情况

如果您碰到SQL Server服务造成内存不断扩展最终系统死机等情况,请按照以下方法解决. 原理:SQL Server 2000引入的动态内存分配机制,一般不能很好的回收内存,如果计算机一直不关闭,就会发生内存耗尽的可能.您可以选择每周关机一次来避免,或者是按照下述方法来抑制内存的增长. 1.在服务器上开始—Microsoft SQL Server—企业管理器 中启动SQL企业管理器 2.启动以后打开右边的控制台树:控制台根目录\Microsoft SQL server\Sql Server组\

SQL Server 2014 内存优化表

不同于disk-based table,内存优化表驻留在内存中,使用 Hekaton 内存数据库引擎实现.在查询时,从内存中读取数据行:在更新时,将数据的更新直接写入到内存中.内存优化表能够在disk上维护一个副本,用于持久化数据集. Memory-optimized tables reside in memory. Rows in the table are read from and written to memory. The entire table resides in memory.

解决CodeIgniter大量查询sql时占用内存大问题

最近的项目上面做大数据插入时总提示内存超出限制 不管怎样unset结果内存仍然很大! 最终发现是CI的机制导致,只要关闭掉问题解决了 $this->db->save_queries = FALSE; 它会把所有执行的SQL保存一份在内存做调试:果断关了! 这东西是从v1.6开始就有 Added $this->DB->save_queries variable to DB driver, enabling queries to get saved or not. Previously

SQL SERVER 占用资源高的SQL语句

--SQL SERVER 占用资源高的SQL语句: --查询占用cpu高的前 50 个 SQL 语句 SELECT total_cpu_time,[total_physical_Reads], total_execution_count, number_of_statements, s2.text --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN