SQLServer内存瓶颈——MEMORYCLERK_SQLOPTIMIZER

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

内存瓶颈——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
目录
相关文章
|
6月前
|
SQL 数据库 流计算
flink-connector-sqlserver-cdc支持SQL server的内存优化表
flink-connector-sqlserver-cdc支持SQL server的内存优化表
49 1
|
SQL 运维 Go
sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
原文:sql server 运维时CPU,内存,操作系统等信息查询(用sql语句) 我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲的就是如何查询它们的相关信息。
1070 0
|
SQL 存储 缓存
sql server 性能调优 资源等待之内存瓶颈的三种等待类型
原文:sql server 性能调优 资源等待之内存瓶颈的三种等待类型 一.概述   这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),SOS_RESERVEDMEMBLOCKLIST(0x007B),RESOURCE_SEMAPHORE_QUERY_COMPILE(0x011A)。
1190 0
|
SQL 存储 缓存
sql server 内存初探
原文:sql server 内存初探 一. 前言    对于sql server 这个产品来说,内存这块是最重要的一个资源, 当我们新建一个会话,相同的sql语句查询第二次查询时间往往会比第一次快,特别是在sql统计或大量查询数据输出时,会有这么感觉。
1116 0
|
SQL Go 关系型数据库
|
SQL 缓存 Go
查看SqlServer的内存使用情况
原文:查看SqlServer的内存使用情况       上一篇提到动态T-SQL会产生较多的执行计划,这些执行计划会占用多少内存呢?今天从徐海蔚的书中找到了答案。动态视图不仅可以查到执行计划的缓存,数据表的页面缓存也可以查到,将SQL整理一下,做个标记。
1536 0
|
SQL 存储 缓存
sqlServer对内存的管理
简介     理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理。   二级存储(secondary storage)     对于计算机来说,存储体系是分层级的。
1139 0
|
SQL 存储 监控
SQL Server 2014 新特性——内存数据库
  SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库... 1 简介:... 1 设计目的和原因:... 1 专业名词.
883 0