SQLServer内存瓶颈——MEMORYCLERK_SQLOPTIMIZER

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

内存瓶颈——MEMORYCLERK_SQLOPTIMIZER

问题

用户应用报错:

There is insufficient system memory in resource pool 'internal' to run this query 

排查

报错是由于内存不足,SQLServer启动后内存开销会很快达到max server memory,所以通过OS看SQLServer内存开销没有意义,我们排查的方向应该是这时候内存被什么占用了/是否有异常/如何优化

我们需要了解SQLOS,它是SQLServer中抽象出的OS包含任务调度、内存管理、异常处理、第三方代码控制等功能,会根据每个过程的特性做内存分类提更详细的信息

SQLOS内存管理记录了很多信息在内部视图中(sys.dm_os_memory_clerks,sys.dm_os_sys_info,sys.dm_os_sys_info,sys.dm_os_ring_buffers,sys.dm_os_memory_nodes...),并且在异常情况会打印DBCC MEMORYSTATUS的结果到日志中,一般而言如果有现场我们先看现场(利用视图),如果事后分析701会在内存中有memorystatus提供给我们

内存701
3

SinglePage占了90%
2

MEMORYCLERK_SQLOPTIMIZER是主要开销
1

MEMORYCLERK_SQLOPTIMIZER过高一般情况是由于存在大量的AD-HOC

问题再复现时现场可以先查MEMORYCLERK_SQLOPTIMIZER的占用

select SUM(single_pages_kb)*1.0/1024 as total_single_pages_MB,
SUM(multi_pages_kb)*1.0/1024 as total_multi_pages_MB
from sys.dm_os_memory_clerks where type='MEMORYCLERK_SQLOPTIMIZER'

解决建议

方案一:实例级别参数调整,第一次查询不存完整的plan

sp_configure N'show advanced options',1
GO
reconfigure
GO
sp_configure N'optimize for ad hoc workloads',1
GO
sp_configure N'show advanced options',1
GO
reconfigure
GO

方案二:应用做些参数化调整

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
SQL 数据库 流计算
flink-connector-sqlserver-cdc支持SQL server的内存优化表
flink-connector-sqlserver-cdc支持SQL server的内存优化表
136 1
|
SQL 缓存
怎样解决SQL Server内存不断增加问题
怎样解决SQL Server内存不断增加问题
773 0
|
SQL Go 关系型数据库
|
SQL 运维 Go
sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
原文:sql server 运维时CPU,内存,操作系统等信息查询(用sql语句) 我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲的就是如何查询它们的相关信息。
1142 0
|
SQL 存储 缓存
Sql Server 内存相关计数器以及内存压力诊断
原文:Sql Server 内存相关计数器以及内存压力诊断   在数据库服务器中,内存是数据库对外提供服务最重要的资源之一,  不仅仅是Sql Server,包括其他数据库,比如Oracle,MySQL等,都是一类非常喜欢内存的应用.  在Sql Server服务器中,最理想的情况是Sql Server把所有所需的数据全部缓存到内存中,但是这往往也是不现实的,因为数据往往总是大于可用的物理内存  可以说内存是否存在压力能够直接决定数据库能否高效运行,  同时,如果内存出现压力,同时也会影响到CPU的使用和存储性能,可以说是一损俱损,具有连带性。
1312 0
|
SQL 存储 缓存
sql server 性能调优 资源等待之内存瓶颈的三种等待类型
原文:sql server 性能调优 资源等待之内存瓶颈的三种等待类型 一.概述   这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),SOS_RESERVEDMEMBLOCKLIST(0x007B),RESOURCE_SEMAPHORE_QUERY_COMPILE(0x011A)。
1284 0
|
SQL 存储 缓存
sql server 内存初探
原文:sql server 内存初探 一. 前言    对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在sql统计或大量查询数据输出时,会有这么感觉。
1172 0
|
3月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
104 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
17天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第8天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统准备、配置安装源、安装 SQL Server 软件包、运行安装程序、初始化数据库以及配置远程连接。通过这些步骤,您可以顺利地在 CentOS 系统上部署和使用 SQL Server 2019。
|
18天前
|
SQL 存储 Linux
从配置源到数据库初始化一步步教你在CentOS 7.9上安装SQL Server 2019
【11月更文挑战第7天】本文介绍了在 CentOS 7.9 上安装 SQL Server 2019 的详细步骤,包括系统要求检查与准备、配置安装源、安装 SQL Server 2019、配置 SQL Server 以及数据库初始化(可选)。通过这些步骤,你可以成功安装并初步配置 SQL Server 2019,进行简单的数据库操作。

相关产品

  • 云数据库 RDS SQL Server 版