一文教会你数据库性能调优,附某大型医院真实案例
点击上方SQL数据库开发,关注获取SQL视频教程
SQL专栏
前言
六大因素
硬件能力 系统规模 数据库内部因素 软件环境
业务模型及架构 代码设计
实战案例
时间:2019年10月某天 事件:某医院客户 下午4点 突然出现大面积的卡慢。整个系统出现严重问题,信息中心电话打爆,医院工程师手足无措。
硬件能力
CPU
Memory
可用内存
IO
系统规模
数据库内部因素
等待
慢语句
什么导致的慢
微软官方的描述:
场景
出现在数据库编译或重编译时,将即席执行计划ad hoc plans 插入到计划缓存中的时候 NUMA架构下,内存对象是按照节点来分区的
type, pages_in_bytes,
CASE
WHEN (0x20 = creation_options & 0x20) THEN 'Global PMO. Cannot be partitioned by CPU/NUMA Node. TF 8048 not applicable.'
WHEN (0x40 = creation_options & 0x40) THEN 'Partitioned by CPU.TF 8048 not applicable.'
WHEN (0x80 = creation_options & 0x80) THEN 'Partitioned by Node. Use TF 8048 to further partition by CPU'
ELSE 'UNKNOWN'
END
from sys.dm_os_memory_objects
order by pages_in_bytes desc
补丁
https://support.microsoft.com/en-us/help/2492381
https://support.microsoft.com/zh-cn/help/3074425/fix-cmemthread-waits-occur-when-you-execute-many-ad-hoc-queries-in-sql
软硬件环境
目前数据库的版本是 11.0.5556.0 而前面提到的补丁,安装后的版本是:11.0.5623.0
代码设计
是什么语句产生了等待?
都是类似下面的语句,最高时,并发超过100.
SELECT
* INTO #Tmp from TB where 1=2
特点如下:
语句简单 开销都小于5不会产生并行
都采用了select into #temptable的形式
就像上面分析的一样,CMEMTHREAD等待是一个并发问题,而不是一个内存问题。在其他方案行不通的时候,我们可以通过调整此类语句的写法,减少CMEMTHREAD等待.
业务模型及架构
解决方案
安装最新的补丁
修改参数
增加TEMPDB数据文件的个数
迁移TEMPDB数据文件的位置
优化程序的代码
优化效果
等待
慢语句
总结
参考
https://blogs.msdn.microsoft.com/psssql/2012/12/20/how-it-works-cmemthread-and-debugging-them/
作者:OwenZeng
链接:https://www.cnblogs.com/OwenZeng/p/8276892.html
——End——
后台回复关键字:1024,获取一份精心整理的技术干货 后台回复关键字:进群,带你进入高手如云的交流群。 推荐阅读 这是一个能学到技术的公众号,欢迎关注
评论