GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SPM

1 背景

由于业务数据的变化或者数据库版本的升级,可能导致SQL的执行计划发生变化,这种变化不一定正收益,这时需 要一个防止计划劣化的机制。该机制需适用于版本升级时固化计划防止计划跳变等场景。

2  SPM 的功能

SPM(SQL Plan Manager)

功能:固化计划防止计划跳变,影响业务性能。

 计划捕获:SPM能将一个具体SQL的执行计划落盘,称之为Plan baseline(计划基线) 

 计划选择:SPM会判断是否将优化器给出的执行计划交给执行器执行,选择优化器给出的执行计划,还是SPM存储的计划。

 计划演进:SPM能将优化器新产生的计划进行判断,如果断优秀会标记(ACC&UNACC)以备计划选择使用。

3 SPM示例

步骤1:数据准备

csdn=> DROP TABLE IF EXISTS tb_a;
DROP TABLE
csdn=> CREATE TABLE tb_a (id int, c1 int, c2 int, pad text);
CREATE TABLE
csdn=> CREATE INDEX tb_a_idx_c1 ON tb_a (c1);
CREATE INDEX
csdn=> INSERT INTO tb_a select  id,  (random()*200)::int,(random()*10000)::int, 'ss'  FROM  (SELECT generate_series(1,10000)  id) tb_a;
INSERT 0 10000
csdn=> ANALYZE tb_a;
ANALYZE
csdn=>

步骤2:参数设置


csdn=> SET spm_enable_plan_capture=manual;   -- 开启SPM计划选择
SET
csdn=> SET spm_enable_plan_selection=on;   -- 当前SPM只支持gplan,确保生成的计划是gplan
SET
csdn=> SET plan_cache_mode = 'force_generic_plan'; -- 在pretty模式可以看到baseline的使用情况
SET
csdn=>
csdn=> SET explain_perf_mode=pretty;  --设置Oracle查看计划显示格风
SET
csdn=>

步骤3:计划捕获

-- 捕获tablescan,确保捕获tablescan计划
csdn=> SET enable_seqscan=on;   
SET
csdn=>
csdn=> SET enable_indexscan=off;
SET
csdn=> SET enable_bitmapscan=off;
SET
csdn=>
-- 执行测试sql
csdn=> PREPARE spm_query AS SELECT * FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |      operation
----+----------------------1 | ->  Seq Scan on tb_a
(1 row)Predicate Information (identified by plan id)
-----------------------------------------------1 --Seq Scan on tb_aFilter: (c1 = $1)
(2 rows)csdn=>csdn=> SELECT sql_hash, plan_hash, outline, status, gplan FROM gs_spm_sql_baseline WHERE sql_text  LIKE '%tb_a WHERE c1 = $1%';sql_hash  | plan_hash |                outline                 | status | gplan
------------+-----------+----------------------------------------+--------+-------1850279601 | 154472964 |  begin_outline_data                   +| ACC    | t|           |  TableScan(@"sel$1" csdn.tb_a@"sel$1")+|        ||           |  version("1.0.0")                     +|        ||           |  end_outline_data                      |        |
(1 row)csdn=>

步骤4:计划选择

csdn=> SET enable_bitmapscan=on;  -- 确保优化器生成的计划是bitmapscan
SET
csdn=> SET enable_seqscan=off;
SET
csdn=>  SET enable_indexscan=off;
SET
-- 执行SQL
csdn=> DEALLOCATE spm_query;
DEALLOCATE
csdn=> PREPARE spm_query AS SELECT *  FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> SET plan_cache_mode = 'force_generic_plan';   --强制走软解析
SET
csdn=> show plan_cache_mode;plan_cache_mode
--------------------force_generic_plan
(1 row)csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |                 operation
----+--------------------------------------------1 | ->  Bitmap Heap Scan on tb_a2 |    ->  Bitmap Index Scan using tb_a_idx_c1
(2 rows)Predicate Information (identified by plan id)
-----------------------------------------------1 --Bitmap Heap Scan on tb_aRecheck Cond: (c1 = $1)2 --Bitmap Index Scan using tb_a_idx_c1Index Cond: (c1 = $1)
(4 rows)====== Query Others =====
----------------------------------------------------------------use_baseline: Yes, sql_hash: 3237163112, plan_hash: 2994191517--查看现有计划
csdn=>  SELECT sql_hash, plan_hash, outline, status, gplan, cost
csdn->  FROM gs_spm_sql_baseline
csdn->  WHERE sql_text like '%tb_a WHERE c1 = $1%'
csdn->  ORDER  BY creation_time;sql_hash  | plan_hash  |                       outline                       | status | gplan |  cost
------------+------------+-----------------------------------------------------+--------+-------+--------1850279601 |  154472964 |  begin_outline_data                                +| ACC    | t     |    166|            |  TableScan(@"sel$1" csdn.tb_a@"sel$1")             +|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |3237163112 | 2994191517 |  begin_outline_data                                +| ACC    | t     | 48.451|            |  BitmapScan(@"sel$1" csdn.tb_a@"sel$1" tb_a_idx_c1)+|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |
(2 rows)csdn=>

注:从查看现有的计划,cost成本为48.451是正能量,对应的sql_hash、plan_hash分别为:

3237163112、 2994191517

步骤5:计划演进

我理解为将最优的计划打上ACC标签,不优的计划打上UNACC即可。

-- 使用spm 计划演进
csdn=>  SELECT * FROM dbe_sql_util.gs_spm_evolute_plan(3237163112,2994191517);evolute_status
----------------t
(1 row)csdn=>  SELECT sql_hash, plan_hash, better,  refer_plan, reason  FROM gs_spm_sql_evolution WHERE sql_hash=3237163112;sql_hash  | plan_hash  | better | refer_plan |                          reason
------------+------------+--------+------------+-----------------------------------------------------------3237163112 | 2994191517 | f      |          0 | execution time is more than 10% greater than the baseline-- 根据演进结论修改seqscan计划状态为UNACC
csdn=> SELECT * FROM dbe_sql_util.gs_spm_set_plan_status (1850279601,154472964,'UNACC');gs_spm_set_plan_status
------------------------t
(1 row)csdn=>
--查看UNACC
csdn=>  SELECT sql_hash, plan_hash, outline, status, gplan, costFROM gs_spm_sql_baselineWHERE sql_text like '%tb_a WHERE c1 = $1%'ORDER  BY creation_time;sql_hash  | plan_hash  |                       outline                       | status | gplan |  cost
------------+------------+-----------------------------------------------------+--------+-------+--------1850279601 |  154472964 |  begin_outline_data                                +| UNACC  | t     |    166|            |  TableScan(@"sel$1" csdn.tb_a@"sel$1")             +|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |3237163112 | 2994191517 |  begin_outline_data                                +| ACC    | t     | 48.451|            |  BitmapScan(@"sel$1" csdn.tb_a@"sel$1" tb_a_idx_c1)+|        |       ||            |  version("1.0.0")                                  +|        |       ||            |  end_outline_data                                   |        |       |
(2 rows)csdn=>

步骤6:计划演证

csdn=> SET enable_seqscan=on;
SET
csdn=> SET enable_indexscan=on;
SET
csdn=> SET plan_cache_mode = 'force_generic_plan';
SET
csdn=> SET explain_perf_mode=pretty;
SET
csdn=> DEALLOCATE spm_query;
DEALLOCATE
csdn=> PREPARE spm_query AS SELECT * FROM tb_a WHERE c1 = $1;
PREPARE
csdn=> EXPLAIN(costs off) EXECUTE spm_query (1);id |                 operation
----+--------------------------------------------1 | ->  Bitmap Heap Scan on tb_a2 |    ->  Bitmap Index Scan using tb_a_idx_c1
(2 rows)Predicate Information (identified by plan id)
-----------------------------------------------1 --Bitmap Heap Scan on tb_aRecheck Cond: (c1 = $1)2 --Bitmap Index Scan using tb_a_idx_c1Index Cond: (c1 = $1)
(4 rows)

4 批注

SPM主要是为要防止因为业务数据变化或版本升级引起的SQL计划跳变而影响业务性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920573.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字IC前端设计——前仿篇(VCS,DVE,Verdi)

文章目录引言一、软件介绍1. VCS2. DVE3. Verdi二、VCS的使用1. VCS的编译流程2. 常用的编译选项1)基础编译选项2)调试相关选项3)性能优化选项4)文件和路径选项3. 常用仿真选项1)基础仿真选项2)运行控制选项…

20250826--inter

一、非对称加密的应用 非对称加密应用-CSDN博客 2、怎么避免跨站脚本攻击,包括还有其他的一些web安全,怎么做的 网页安全XSS攻击和CSRF攻击_csrf共计-CSDN博客 3、前端异常监控,性能监控,埋点,怎么做的 &#xff1f…

MongoDB Shell

MongoDB官方提供的单独命令行工具 MongoDB Shell Download | MongoDB 下载MongoDB Shell windows系统打开,直接在解压后的目录里面找到bin目录 然后双击打开mongosh.exe这个文件 看到这个命令行就表示Mongo Shell已经启动成功了 test代表 当前正在使用的数据库的…

Docker03-知识点整理

Docker03-知识点整理 文章目录Docker03-知识点整理1-参考网址2-知识整理2-思考题1-Docker image和Docker Native image有什么区别1. Docker Image(Docker 镜像)定义特点构建和使用示例2. Docker Native Image(通常指 GraalVM Native Image 结…

华为 eNSP 从入门到精通:企业级网络仿真全攻略

一、eNSP 简介华为 eNSP(Enterprise Network Simulation Platform )是面向企业网络的虚拟化仿真平台,其核心架构基于分布式虚拟化引擎和真实设备镜像,具备以下技术亮点:高度仿真:可模拟华为 AR 路由器、x7 …

docker compose设置命令别名的方法

docker compose名字比较长,输入比较费事,可以为它设置别名来简化输入。1、Linux编辑~/.bash_aliasesalias dcdocker-compse编辑~/.bashrc,确认其包含以下内容:if [ -f ~/.bash_aliases ]; then. ~/.bash_aliasesfi重新加载 ~/.bas…

【RAGFlow代码详解-10】文本处理和查询处理

概述 文本处理和查询处理系统将自然语言查询转换为与 RAGFlow 的文档存储后端配合使用的优化搜索表达式。该系统支持中英文文本处理,具有专门的标记化、术语加权和查询增强技术。核心组件 FulltextQueryer 类 FulltextQueryer 类是查询处理和文本分析的主要接口。它…

利用机器学习优化Backtrader策略原理与实践

1. Backtrader框架概述 1.1 Backtrader简介 Backtrader是一个功能强大且灵活的Python库,专为量化交易策略的开发、测试和执行而设计。它提供了丰富的功能,包括数据获取、策略开发、回测、优化和绘图等。Backtrader的核心优势在于其模块化设计和高度可扩展…

CPTS-Pressed复现(XML-RPC)

该box主要是了解wordpress-XML-RPC 的使用 端口扫描只有80端口开启 可以使用wpscan进行扫描发现bak文件得到凭证,尝试登陆(这里是将原密码的2021修改为2022尝试登陆,该主机发布时间为2022年)发现有2FA,但是能够滥用 xm…

【机器学习深度学习】Embedding 与 RAG:让 AI 更“聪明”的秘密

目录 前言 一、RAG 的两大阶段 1. 知识库构建阶段 2. 查询检索与生成阶段 二、为什么 RAG 比单纯大模型更靠谱? 四、Embedding 在 RAG 中的作用 五、Embedding 的优势 六、Embedding 的挑战 七、RAG 优势与挑战对比 八、应用场景举例 总结 前言 在大模型…

python 转偶数

目录 python变量转偶数 box转偶数 python变量转偶数 x1 int(x1) // 2 * 2 y1 int(y1) // 2 * 2 x2 int(x2) // 2 * 2 y2 int(y2) // 2 * 2 box转偶数 def save_mp4(output_path,box_list,img_list,clip_start,clip_end):writer imageio.get_writer(output_path,fps30,c…

Linux - 中文显示乱码问题解决方法(编码查看及转换)- 学习/实践

1.应用场景 主要用于Linux中文显示乱码问题解决(编码查看及转换) 2.学习/操作 1.文档阅读 Linux中文显示乱码问题解决方法(编码查看及转换) - 整合侠 - 博客园 截图: 2.整理输出 TBD 后续补充 ... 3.问题/补充 TBD 后续补充 ...…

网络_协议

关键词: OSI是Open System Interconnect的缩写,意为开放式系统互联。 RTT : Round-Trip time 往返时间 RTO:Retransmission Timeout超时重传时间 MSL : OSI 七层模型和 TCP/IP 四层模型 OSI七层模型和TCP/IP五层模型&#…

vscode有的结构体不能补全,有的可以补全问题的解决.

定义了一个结构体,发现不能自动补全变量名称.而另外一个结构体却可以正常补全.经过研究发现是,新定义的结构体变量类型uint32_t,vscode认为其是错误类型导致的.暂时改为int型,后发现问题消失.可以正常补全了.由于工程使用cubeide生成,uint32_t定义在软件安装目录,并没有和项目文…

JavaScript 数组核心操作实战:最值获取与排序实现(从基础到优化)

在JavaScript开发中,数组的“最值获取”和“排序”是高频需求。本文将基于你的原始代码,系统解析数组最值获取、升序/降序排序的实现逻辑,通过“问题分析→代码优化→原理讲解”的流程,帮助你掌握更灵活、高效的数组操作方法&…

driver.js实现前端页面引导

1.安装 npm install driver.js2.实现代码示例 <template><div class"home-container"><!-- 页面内容 --><LeftPanel id"guide-left-panel" /><button id"guide-file-upload">文件上传</button><button i…

技术速递|使用 AI 应用模板扩展创建一个 .NET AI 应用与自定义数据进行对话

在本快速入门中&#xff0c;你将学习如何使用 .NET AI 应用模板创建一个 .NET AI 应用&#xff0c;与自定义数据进行对话。该模板旨在简化 .NET 构建 AI 应用的上手体验&#xff0c;帮助你处理常见的设置任务和配置。 先决条件 .NET 9.0 SDK 以下任一 IDE&#xff08;可选&am…

使用Cloudflare的AI Gateway代理Google AI Studio

1、说明详见&#xff1a;详见&#xff1a;https://developers.cloudflare.com/ai-gateway/usage/providers/google-ai-studio在"Google AI Studio"创建"API key" 在"Cloudflare"创建"AI Gateway"、获取"Account ID"2、在“G…

Scrapy 框架实战:构建高效的快看漫画分布式爬虫

一、Scrapy框架概述 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;它提供了强大的数据提取能力、灵活的扩展机制以及高效的异步处理性能。其核心架构包括&#xff1a; Engine&#xff1a;控制所有组件之间的数据流&#xff0c;当某个…