原文链接:
http://click.aliyun.com/m/25022/
摘要: # 背景引入 执行计划缓存是SQL Server内存管理中非常重要的特性,这篇系列文章我们探讨执行计划缓存设计中遇到的single-used plans问题,以及如何发现、如何定性和定量分析single-used plans带来的影响,最后我们使用两种方法来解决这个问题。 # 什么是Single-used Plans 要解释清楚什么是Single-used Plans,首先需要解释SQL语句
背景引入
执行计划缓存是SQL Server内存管理中非常重要的特性,这篇系列文章我们探讨执行计划缓存设计中遇到的single-used plans问题,以及如何发现、如何定性和定量分析single-used plans带来的影响,最后我们使用两种方法来解决这个问题。
什么是Single-used Plans
要解释清楚什么是Single-used Plans,首先需要解释SQL语句执行计划缓存是什么?SQL Server执行每一条SQL语句之前,会从执行计划缓存内存中查看是否存在本条语句的执行计划,如果不存在,会将其编译、选择最优路径、生成执行计划,然后会将执行计划存储在一块专门的内存区域中(这块内存叫着执行计划缓存),以供下次该语句执行直接从执行计划缓存中获取编译完毕的执行计划。以此来节约数据库系统对于查询语句编译、生成执行计划过程的性能开销,提高SQL语句的执行效率。
而Single-used Plans是指那些第一次执行后被缓存起来的执行计划,而后再也没有被重复利用过的执行计划缓存。其中ad hoc query(即席查询)就是典型的single-used plans中的一种。
如何发现Single-used Plans
从上一节我们可以大致知道,single-used plans仅会第一次被使用(从名字也可以很好理解到这一点),所以,实际上single-used plans是对SQL Server内存空间和CPU资源的浪费,对数据库性能有一定的损害。那么,我们如何来发现single-used plans呢?我们可以使用下面的查询语句:
USE master
GO
SELECT
database_name = QUOTENAME(db.name),
st.text,
cp.objtype,
cp.size_in_bytes,
qp.query_plan,
cp.cacheobjtype
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
INNER JOIN sys.databases AS db WITH(NOLOCK)
ON st.dbid = db.database_id
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
WHERE cp.cacheobjtype = N'Compiled Plan'
AND cp.objtype IN (N'Adhoc', N'Prepared')
AND cp.usecounts = 1
ORDER BY cp.size_in_bytes DESC
我的测试实例展示的查询结果如下:
01.png
执行计划缓存中有多少Single-used Plans
当我们可以有效的发现single-used plans以后,我们可能又会问:到底我的SQL Server数据库实例中,有多少执行计划缓存是属于single-used plans类型呢?可以从两个维度来分析:
Single-used plans记录总数
Single-used plans总的执行计划占用的内存空间大小
可以使用以下的查询语句来回答这个问题。
USE master
GO
SELECT
COUNT(1) AS [total_plans],
CAST(SUM(size_in_bytes)/1024. AS DECIMAL(18,2)) AS [total_size_in_kb],
CAST(SUM((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END))/1024. AS DECIMAL(12,2)) AS [total_size_single_used_in_kb],
SUM(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [total_plans_count_single_used],
AVG(usecounts) AS [avg_used_counts],
CAST(AVG(size_in_bytes)/1024. AS DECIMAL(12, 2)) AS [avg_used_size_kb]
FROM sys.dm_exec_cached_plans WITH(NOLOCK)
我的测试实例执行结果如下截图:
02.png
从这个结果我们可以得出如下single-used plans的数据:总的single-used plans记录数为73,内存空间占用大小为13912 KB。
Single-used Plans对性能的影响
就单单一条Single-used Plan来看的话,对数据库系统的性能影响很小,小到可以忽略的地步,所以,数据库执行计划缓存中,存在少量的Single-used Plans是很正常的,可以不用太关注。但是,如果Single-used Plans大量存在的话,可能就会对系统带来比较严重的性能影响。
定性分析
定性分析大量Single-used Plans对数据性能的影响,主要体现在以下几个方面:
总的执行计划缓存利用率不高:因为存在大量不能被重复利用的执行计划缓存,从而拉低了执行计划缓存整体利用率
浪费执行计划缓存中内存的开销:每一条执行计划缓存或多或少会占用一定的执行计划缓存内存空间,大量的Single-used Plans导致了内存空间的浪费
导致CPU使用率的上升:每一条SQL语句执行计划的编译、最优路径选择和执行计划缓存,这些过程都需要消耗系统CPU资源,如果大量存在Single-used Plans,会导致系统CPU使用率的上升。
举一个最为极端的例子,假设执行计划缓存中存储的所有执行计划都是Single-used Plans的话,那么导致的严重后果是:
执行计划缓存利用率就是0%,因为没有任何的执行计划被重用
执行计划缓存这种设计就毫无意义,因为缓存起来也没有被重用
浪费执行计划缓存的内存开销和CPU开销
定量分析
以上是定性分析Single-used Plans对系统性能的影响,那么到底Single-used Plans达到哪个数量级,占比多少的时候,我们需要密切关注呢?虽然微软没有官方的推荐数字,但是个人比较推荐的两个数字是2GB和50%,即:所有的Single-used Plans使用的内存空间超过2GB或者内存空间使用占比超过50%。当然最终也可能取决于SQL Server可以使用的最大内存数量。
USE master
GO
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
SELECT
objtype AS [cachetype],
COUNT(1) AS [total_plans],
CAST(SUM(size_in_bytes)/1024. AS DECIMAL(18,2)) AS [total_size_in_kb],
CAST(SUM((CASE WHEN usecounts = 1 THEN size_in_bytes ELSE 0 END))/1024. AS DECIMAL(12,2)) AS [total_size_single_used_in_kb],
SUM(CASE WHEN usecounts = 1 THEN 1 ELSE 0 END) AS [total_plans_count_single_used],
AVG(usecounts) AS [avg_used_counts],
CAST(AVG(size_in_bytes)/1024. AS DECIMAL(12, 2)) AS [avg_used_size_kb]
INTO #temp
FROM sys.dm_exec_cached_plans WITH(NOLOCK)
GROUP BY objtype
SELECT
[cachetype],
[total_plans],
[total_size_in_kb],
[total_plans_count_single_used],
[total_size_single_used_in_kb],
CAST(([total_plans_count_single_used]*1.0 / [total_plans]*1.0) * 100. AS DECIMAL(12, 2)) AS [single_used_plan_count%],
CAST([total_size_single_used_in_kb]/[total_size_in_kb] * 100. AS DECIMAL(12, 2)) AS [single_used_size%],
[avg_used_counts],
[avg_used_size_kb]
FROM #temp
ORDER BY [total_size_single_used_in_kb] DESC
SELECT
SUM([total_plans]) AS total_plan_counts,
SUM([total_size_in_kb]) AS total_plan_size_in_kb,
SUM([total_plans_count_single_used]) AS [total_plans_counts_single_used],
SUM([total_size_single_used_in_kb]) AS [total_plan_size_single_used_in_kb],
CAST(SUM([total_plans_count_single_used]) * 100. / SUM([total_plans]) AS DECIMAL(12, 2)) AS [plan_counts_single_used%],
CAST(SUM([total_size_single_used_in_kb]) * 100. / SUM([total_size_in_kb]) AS DECIMAL(12, 2)) AS [plan_size_single_used%]
FROM #temp
执行结果如下所示:
03.png
从这个执行结果来看,在我的SQL Server测试实例上,single-used plans占用的执行计划记录数为72条,内存空间占用14016 KB;single-used plans执行计划记录数占总的百分比为39.78%,内存空间占用比例为50.59%。
解决Single-used Plans问题
原文链接:
http://click.aliyun.com/m/25022/
分享到:
相关推荐
根据提供的文件信息,我们可以推断出这是一份关于Yamaha RX-V340/RX-V340RDS/HT-R5630/HT-R5630RDS/DSP-AX340等型号音频接收器的服务手册。这份手册主要面向授权零售商及其服务人员。接下来将对这些型号的产品进行...
阿里云云栖大会分享PPT中提到了如何优化阿里云*** Server的CPU使用率。具体来说,主要分享内容包括:数据类型转换、非SARG查询、统计信息维护、参数嗅探问题、以及TOP SQL分析。 数据类型转换在数据库优化中是一个...
标签:aws-rds-1.8.1-javadoc.jar,aws,rds,1.8.1,javadoc,jar包下载,依赖包
* 版本:指数据库版本,目前 RDS 支持的数据库版本包括 MySQL 5.5/5.6/5.7、SQL Server 2008 R2/2012、PostgreSQL 9.4 和 PPAS 9.3 目标读者 * 首次购买 RDS 实例的用户 * 新建实例后需要对其进行基本设置的用户 *...
Amazon RDS是一种完全托管的关系数据库服务,支持多种数据库引擎,如MySQL、PostgreSQL、Oracle、SQL Server等。通过boto3,开发者能够轻松地创建、配置、管理和操作RDS实例,进行数据查询、备份、恢复等操作。 ...
SQL Server磁盘空间清理及过引重建
资源分类:Python库 所属语言:Python 资源全名:aws_cdk.aws_rds-1.45.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
《PyPI官网下载:mypy-boto3-rds-data-1.17.105.tar.gz——Python库解析》 PyPI(Python Package Index)是Python开发者们分享和获取Python软件包的主要平台,它是Python生态系统的核心组成部分。本文将详细探讨...
Amazon RDS Data Service允许开发者直接在数据库实例上执行SQL查询,而无需创建额外的数据库连接。它支持多种数据库引擎,如MySQL、PostgreSQL、Oracle等,提供了强大的事务处理能力和数据转换功能。mypy-boto3-rds-...
描述中提到,“AWS RDS SQL Server”和“这个terraform模块创建一个SQL Server RDS实例和关联的资源”,这表明该模块不仅会创建RDS实例,还会处理与之相关的其他组件,如安全组、参数组、备份策略等,这些都是在AWS...
1. **快速解析**:RDS JSON模块使用高效的算法来解析JSON字符串,避免了将JSON数据转发到其他进程或服务的开销。 2. **数据缓存**:解析后的JSON数据可以被缓存在Nginx内存中,加快后续请求的响应速度。 3. **自定义...
RDS-PP技术文档主要介绍了一种名为RDS-PP的电厂标识系统,这是由VGB组织发布的面向电力行业的新型电厂和相关组件的标识系统。RDS-PP是现有KKS标识系统的现代化版本,主要改进和扩展了对电力厂组件进行标识的要求。 ...
标题中的“PyPI 官网下载 | mypy-boto3-rds-data-1.16.11.0.tar.gz”表明这是一个从Python Package Index (PyPI) 下载的压缩包,具体是mypy-boto3-rds-data的1.16.11.0版本。PyPI是Python开发者发布和获取开源软件包...
标签:aws-rds-1.6.1-incubating-sources.jar,aws,rds,1.6.1,incubating,sources,jar包下载,依赖包
标签:aws-rds-1.6.2-incubating-tests.jar,aws,rds,1.6.2,incubating,tests,jar包下载,依赖包
标签:aws-rds-1.6.1-incubating-tests.jar,aws,rds,1.6.1,incubating,tests,jar包下载,依赖包
标签:aws-rds-1.6.2-incubating-javadoc.jar,aws,rds,1.6.2,incubating,javadoc,jar包下载,依赖包
标签:aws-rds-1.6.2-incubating-sources.jar,aws,rds,1.6.2,incubating,sources,jar包下载,依赖包
标签:aws-rds-1.6.1-incubating-javadoc.jar,aws,rds,1.6.1,incubating,javadoc,jar包下载,依赖包