您的位置:首页 > 数据库

优化SQL Server的内存占用之执行缓存

2013-12-27 10:43 267 查看
sys.dm_exec_cached_plans中的查询计划: 

 Select Count(*) CNT,sum(size_in_bytes) TotalSize From sys.dm_exec_cached_plans

sql server(WINDOWS平台上强大的数据库平台)内存占用由哪几部分组成。sql server(WINDOWS平台上强大的数据库平台)占用的内存主要由三部分组成:数据缓存(Data Buffer)、执行缓存(Procedure Cache)、以及sql server(WINDOWS平台上强大的数据库平台)引擎程序。

sql server(WINDOWS平台上强大的数据库平台)引擎程序所占用缓存一般相对变化不大,则我们进行内存调优的主要着眼点在数据缓存和执行缓存的控制上。

SQL语句在执行前首先将被编译并通过查询优化引擎进行优化,从而得到优化后的执行计划,然后按照执行计划被执行。对于整体相似、仅仅是参数不同的SQL语句,sql server(WINDOWS平台上强大的数据库平台)可以重用执行计划。但对于不同的SQL语句,sql server(WINDOWS平台上强大的数据库平台)并不能重复使用以前的执行计划,而是需要重新编译出一个新的执行计划。同时,sql server(WINDOWS平台上强大的数据库平台)在内存足够使用的情况下,此时并不主动清除以前保存的查询计划(注:对于长时间不再使用的查询计划,sql
server(WINDOWS平台上强大的数据库平台)也会定期清理)。这样,不同的SQL语句执行方式,就将会大大影响sql server(WINDOWS平台上强大的数据库平台)中存储的查询计划数目。

对于减少执行缓存的占用,主要可以通过使用参数化查询减少执行缓存占用。

1、使用参数化查询减少执行缓存占用

对此,我们一般可以通过两种方式实现参数化查询:一是尽可能使用存储过程执行SQL语句(这在现实中已经成为sql server(WINDOWS平台上强大的数据库平台) DBA的一条原则),二是使用sp_executesql 方式执行单个SQL语句

在现实的同一个软件系统中,大量的负载类型往往是类似的,所区别的也只是每次传入的具体参数值的不同。所以使用参数化查询是必要和可能的。

2、检查并分析sql server(WINDOWS平台上强大的数据库平台)执行缓存中的执行计划

  通过上面的介绍,我们可以看到SQL缓存所占用的内存大小。也知道了sql server(WINDOWS平台上强大的数据库平台)执行缓存中的内容主要是各种SQL语句的执行计划。则要对缓存进行优化,就可以通过具体分析缓存中的执行计划,看看哪些是有用的、哪些是无用的执行计划来分析和定位问题。

  通过查询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语句,然后进行相应的调优分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: