热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQLServerRESOURCE

概述:当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态。最好的方法是一开始就建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在内存压力的话,就要找出是什么原因导致的。可以检查事务的等待状态,其中Resource_sema

概述: 当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态。最好的方法是一开始就建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在内存压力的话,就要找出是什么原因导致的。可以检查事务的等待状态,其中Resource_sema

概述:

当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态。最好的方法是一开始就建立一个性能基线,以便做性能对比。当发现与性能基线对比后,存在内存压力的话,就要找出是什么原因导致的。可以检查事务的等待状态,其中Resource_semaphore等待可能出现最多。下面是如何去处理这个问题:

当检查事务的所有等待类型后,可能会发现Resource_semaphore这个等待类型出现非常多,这会增加一些页面的IO等待。因为这些事务没有足够的内存来处理它们的操作,所以到这了页面的IO等待。

Resource_semaphore等待:

首先我们来弄清楚一下什么是Resource_semaphore等待。当SQLServer收到一个用户请求(或者查询时)。首先会创建一个编译后的计划,然后在这个基础上创建一个执行计划。当SQLServer创建一个编译后的计划时,它会计算两个内存授予参数,成为:请求内存(required memory)和额外内存(additional memory)

请求内存是运行排序和hash连接的所需最少内存,之所谓成为“请求”,是因为查询不需要在一开始就申请这部分的内存。而额外内存是存放临时数据到内存中所需的那部分内存。如果没有足够的内存,查询所需的数据将会存到硬盘当中。

首先,服务器会计算运行特定查询所需要的内存。这部分通常等于请求内存和额外内存的总和。但当实例使用并行执行时,所需的内存为(请求内存*并行度)加上额外内存的总和。服务器会检查是否有足够的内存来运行每个查询,然后会降低额外内存的量,知道所有总内存需求量刚好达到内存的限制量。这部分修改后的内存成为需求内存(requested memory)。在SQLServer内不能,有一个叫Resource Semaphore的设置,用于授予需求内存用于查询。当查询没有得到足够的内存,就会把等待状态改为:Resource_Semaphore。可以从sysprocesses系统表或者sys.dm_exec_request DMV中查询。

当Resource_semaphore接受一个新的请求时,首先检查是否有查询还在等待中,如果发现有,那么会把这个新请求放到先进先出的队列中,Resource Semaphore会尝试对未等待的查询授予内存,这部分内存可能是之前的查询执行完毕后返回的内存。如果发现有足够的内存,那么就会把内存赋予给处于Resource Semaphore等待状态的查询,让其开始运行。如果不够,那么会把查询放入等待队列并标记为Resource_Semaphore等待。因此,看这个等待状态可以发现内存存在压力。


识别Resource_Semaphore等待:

步骤1:

执行以下语句,并筛选Resource_Semaphore等待的数据:

SELECT  *
FROM    sys.SYSPROCESSES
WHERE   lastwaittype = 'RESOURCE_SEMAPHORE'
ORDER BY lastwaittype

由于这种情况不好模拟出来,所以没有截图。


步骤2:

从步骤1中得到的结果,可能会看到很多的事务处于ResourceSemaphore 等待状态,现在可以运行下面语句来查看已分配到内存的查询的目前状态,和未被分配内存的查询的数量。这个DMV会返回两行,一行是resource_semaphore_id为0的大查询,另外一些是为1的小查询,这里的小是内存小于5M。在这里可以获得总授予内存和实例上总可用内存。可以查看grantee_count和waiter_count,grantee_count是已经分配了内存的总查询数量,而waiter_count是在队列中等待授予内存的总查询数量:


SELECT  *
FROM    sys.dm_exec_query_resource_semaphores

步骤3:

然后使用DMV:sys.dm_exec_query_memory_grants来获得在等待队列中的查询所需要内存的详细信息。这些查询的grant_time和granted_memory_kb可能为null。也可以从这个DMV中得到plan_handle和sql_handle:

SELECT  *
FROM    sys.dm_exec_query_memory_grants

我们要关注的是下面3列:



步骤4:

现在将要找到集中消耗内存的查询,可以查看所有等待查询中的需求内存。当看到这部分内存太大的时候,然后找到这些查询的plan_handle,并查看它们的执行计划:


SELECT TOP 10
        *
FROM    sys.dm_exec_query_memory_grants

步骤5:

把步骤4中查询的plan_handle的数据复制,然后执行:


SELECT * FROM sys.dm_exec_sql_text(sql_handle)

注意替换括号中的sql_handle。然后查看其执行计划。

总结: 通过上面的步骤找到耗费内存的查询后,应该调整语句,使其占用更少的资源。以便解决内存压力。
推荐阅读
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 本文详细介绍了 MySQL 的查询处理流程,包括从客户端连接到服务器、查询缓存检查、语句解析、查询优化及执行等步骤。同时,深入探讨了 MySQL 中的乐观锁机制及其在并发控制中的应用。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 近期遇到电脑网络不稳定和游戏时频繁重启的问题,寻求专业建议。网络环境为ADSL调制解调器通过路由器共享给两台电脑使用,怀疑存在ARP攻击或硬件配置问题。希望获得详细的故障排查和解决方案。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
author-avatar
火俊逸香嘉孝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有