在SQL Server中,会话的状态有运行(Running)、睡眠(Sleeping)、休眠(Dormant)、Preconnect 等状态,有时候你会在数据库中看到很多会话处于睡眠(Sleeping)状态,那么这些睡眠(Sleeping)状态的会话会消耗CPU、Memory资源吗?如果消耗资源的话,那么sleeping会话具体消耗多少内存资源呢? 另外它会影响数据库性能吗?

首先,处于睡眠(Sleeping)状态的会话意味着当前没有运行任何请求。这样也意味着这种状态的会话是不会消耗CPU资源的,那么它是否消耗内存资源呢?答案是会,它会保留了一定数量的内存,用于保存与会话相关的结构。 这包括会话上下文等信息, 关于每个处于睡眠状态会话消耗的内存具体大小,可以使用下面脚本查看睡眠(Sleeping)状态会话消耗的内存(不确定其值的准确性,文末有介绍):

SELECT 

      s.session_id

    , s.status

    , s.last_request_start_time

    , s.memory_usage*8 AS memory_usage_kb

    , t.task_state

    , s.host_name

    , s.program_name

    , s.transaction_isolation_level

    --, s.open_transaction_count

FROM sys.dm_exec_connections AS c

JOIN sys.dm_exec_sessions AS s ON

    s.session_id = c.session_id

LEFT JOIN sys.dm_os_tasks AS t ON

    t.session_id = s.session_id

WHERE s.status='sleeping'

ORDER BY

     s.memory_usage DESC;

使用这个这个脚本查出,发现处于睡眠(Sleeping)状态会话消耗的内存有很多情况: 0KB、16KB、24KB、32KB、40KB、.....216KB.  似乎没有什么规律,当然以32KB、40KB居多。官方文档关于这方面的介绍几乎没有,仅仅在“Memory Used by SQL Server Objects Specifications”中有部分介绍,如下所示:

下表列出 SQL Server 中不同对象所用内存的大致数值。列出的数值为估计值,具体取决于环境和创建对象的方式。SQL Server 2005 管理某些项的方式与早期版本存在显著差异。

SQL Server 2000

SQL Server 2005

SQL Server 2008

每个所有者 64 字节 + 32 字节

每个所有者 64 字节 + 32 字节

每个所有者 64 字节 + 32 字节

打开的数据库

每个文件 3924 字节 + 1640 字节,每个文件组 336 字节

不适用于 SQL Server 2005

不适用于 SQL Server 2008

打开的对象

对象中每个打开的索引 256 字节 + 1724 字节

不适用于 SQL Server 2005

不适用于 SQL Server 2008

用户连接

12 KB + (3 * network_packet_size)

约为 (3 * network_packet_size + 94 KB)

约为 (3 * network_packet_size + 94 KB)

网络数据包大小是表格格式数据流 (TDS) 数据包的大小,该数据包用于应用程序和 SQL Server 数据库引擎之间的通信。默认的数据包大小为 4 KB,由“网络数据包大小”配置选项控制。

启用多个活动的结果集时,用户连接约为 (3 + 3 * num_logical_connections) * network_packet_size + 94 KB。

但是在SQL Server 2008之后的文档,没有看到这方面内容的介绍。在SQL Server 2005、SQL Server 2008数据库中测试发现(使用最上面的脚本)memory_usage大小为16KB、24KB,远小于94KB,这个文档和测试结果也一度让我怀疑sys.dm_exec_sessions这个DMV视图中memory_usage字段计算Sleeping会话消耗内存的准确性。很遗憾,官方资料关于memory_usage的介绍仅为:Number of 8-KB pages of memory used by this session. Is not nullable. 不过,有点可以确认的是:Sleeping状态的会话消耗的内存资源真的很少。基本上对数据库性能影响很小。

参考资料:

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008-r2/aa337559(v=sql.105)

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/62d19c9e-7ccb-4e1b-a18f-f249c23f0376/sleeping-spids-consume-cpu-and-memory-?forum=sqlgetstarted

https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sessions-transact-sql?view=sql-server-2017

SQL Server Sleeping会话占用内存资源浅析?的更多相关文章

  1. SQL Server 2008 R2占用内存越来越大两种解决方法

    SQL Server 2008 R2运行越久,占用内存会越来越大. 第一种:有了上边的分析结果,解决方法就简单了,定期重启下SQL Server 2008 R2数据库服务即可,使用任务计划定期执行下边 ...

  2. SQL Server 2008 R2占用内存越来越大解决方法

    最近开发sql server数据库项目的过程中发现了这么一个问题,后台网站内存占用95%,通过任务管理器查看占内存的进程sqlserver.exe,是因为SQL Server 2008 R2运行越久, ...

  3. SQL Server 2014里的IO资源调控器

    在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...

  4. 如何使用 DBCC MEMORYSTATUS 命令来监视 SQL Server 2005 中的内存使用情况

    https://technet.microsoft.com/en-us/solutionaccelerators/dd537566.aspx 注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完 ...

  5. 《Troubleshooting SQL Server》读书笔记-内存管理

    自调整的数据库引擎(Self-tuning Database Engine) 长期以来,微软都致力于自调整(Self-Tuning)的SQL Server数据库引擎,用以降低产品的总拥有成本.从SQL ...

  6. 显示SQL Server分配的全部内存

    1.在sqlserver 中建立查询 2.执行 DBCC MEMORYSTATUS 在Windows Server 2000/2003任务管理器中,“内存使用”这个字段是显示工作区分配的内存.一个进程 ...

  7. 查看SQL Server当前会话的隔离级别

    查看SQL Server当前会话的隔离级别 DBCC USEROPTIONS

  8. sql server 性能调优之 资源等待内存瓶颈的三种等待类型

    一.概述 这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),SOS_RESERVEDMEMBLOCKLIST(0x007B),RESO ...

  9. sql server 性能调优之 资源等待SOS_SCHEDULER_YIELD

    一.概念 SOS_SCHEDULER_YIELD等待类型是一个任务自愿放弃当前的资源占用,让给其他任务使用.   这个等待类型与CPU有直接关系,与内存与也有间接关系,与CPU有关系是因为在sql s ...

随机推荐

  1. c# list排序的实现方式

    实体类实现IComparable接口,而且必须实现CompareTo方法 实体类定义如下: class Info:IComparable { public int Id { get; set; } p ...

  2. mongodb启动脚本

    #!/bin/sh # #chkconfig: #description: mongodb start() { /usr/local/yunshipei/enterplorer/mongodb/bin ...

  3. 表单enctype属性

    首先知道enctype这个属性管理的是表单的MIME编码.共有三个值可选:1.application/x-www-form-urlencoded2.multipart/form-data3.text/ ...

  4. Servlet拦截方式

    Servlet拦截方式 1.拦截固定后缀的url,比如设置为 *.do.*.action, 例如:/user/add.action 此方法最简单,不会导致静态资源(jpg,js,css)被拦截. 2. ...

  5. 正则表达式 LINUX

    正则表达式 热身 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等. 例如 g ...

  6. 如何在VS2015中使用Git命令提示符

    本文转载自 http://qkxue.net/info/176223/Visual-Studio-Git VS2015自带了Git插件,但有时候觉得Git控制台命令更方便些.VS中本身不能把Git B ...

  7. vb常用命名空间

    摘自:http://www.2cto.com/kf/201211/170837.html 感谢 (一)如下是系统中分离出来Imports MicrosoftImports Microsoft.CSha ...

  8. Solr 6.7学习笔记(07)-- More Like This

    Solr中提供了MoreLikeThis的功能,用于查询相似的文档 .应用场景(个人理解):1. 你写的文章和别人文章相似度高的话,有一方是抄袭的可能性就很大.2. 查找相似的产品. MoreLike ...

  9. 51nod1205(johnson)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1205 题意:中文题诶- 思路:johnson模板题 流水作业调 ...

  10. 蓝桥杯T32(树的直径)

    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T32 题意:中文题诶- 思路:显然给出的地图是一颗树,若能求得树的直径 ans,则答案为:ans*(ans+1 ...