当前位置: 首页 > news >正文

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

1 业务背景

GaussDB的优化器生成计划不优的情况下,对DBA调优过程中不对业务sql修改场景下,提供3种计划管理,分别为plan hint,sql patch,spm。

2 sql patch的使用场景

在发现查询语句的执行计划、执行方式未达预期的场景下,可以通过创建查询补丁的方式, 使用 Hint对查询计划进行调优或对特定的语句进行报错短路处理。

SQL  Patch能够在避免直接修改用户业务语句的前提下对查询执行的方式做一定调整。

3 使用前提

1)、SQL Patch的实现基于Unique SQL  ID,所以需要打开相关的运维参数才可以生效 ( enable_resource_track = on,   instr_unique_sql_count > 0)。
2)、Unique SQL  ID在WDR报告和慢SQL视图中都可以获取到,在创建SQL  Patch时需要指定Unique SQL  ID 。
3)、对于存储过程内的SQL则需要设置参数 instr_unique_sql_track_type  =  'all' 后在 dbe_perf.statement_history视图中查询Unique SQL ID 。

4 使用举例

步骤1:创建测试数据

[Ruby@dtest1 ~]$ gsql -h xx.xxx.xx.71 -dcsdn -p8000 -U csdn -W '******' -ar
gsql ((GaussDB Kernel 505.2.1 build 159cea95) compiled at 2024-12-27 09:22:44 commit 10161 last mr 21504 release)
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.csdn=>
csdn=> set search_path=csdn;
SET
csdn=> CREATE TABLE hint_t1(a int, b int, c int);
CREATE TABLE
csdn=> CREATE  INDEX ON hint_t1(a);
CREATE INDEX
csdn=> INSERT  INTO hint_t1 VALUES(1, 1, 1);
INSERT 0 1

步骤2:打开FullSQL统计信息(track_stmt_stat_level:L1,L1)

csdn=> SET track_stmt_stat_level  = 'L1,L1';
SET
csdn=> SET explain_perf_mode = normal;
SET

步骤3:登入postgres库获取unique sql id

gsql -h ***.***.***71 -p 8000 -d postgres -U root -W ******* -ar
gsql ((GaussDB Kernel 505.2.1 build 159cea95) compiled at 2024-12-27 09:22:44 commit 10161 last mr 21504 release)
SSL connection (cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128)
Type "help" for help.gaussdb=> SELECT unique_query_id, query, query_plan  FROM dbe_perf.statement_history WHERE query  LIKE '%hint_t1%';unique_query_id |                   query                   |                                 query_plan-----------------+-------------------------------------------+-------------------------------------------------------------------
----------868389431 | SELECT * FROM hint_t1 t1 WHERE t1.a =  ?; | Datanode Name: dn_6001_6002_6003+|                                           | Bitmap Heap Scan on hint_t1 t1  (cost=4.33..14.88 rows=10 width=12
)        +|                                           |   Recheck Cond: (a = '***')+|                                           |   ->  Bitmap Index Scan on hint_t1_a_idx  (cost=0.00..4.33 rows=10width=0)+|                                           |         Index Cond: (a = '***')+|                                           |+|                                           |
(1 row)

得到的unique sql id为:868389431

步骤4:登入业务库,对指定SQL使用SQL Patch

SELECT * FROM dbe_sql_util.create_hint_sql_patch('patch1', 868389431, 'indexscan(t1)');create_hint_sql_patch
-----------------------t
(1 row)csdn=> set search_path=csdn;
SET

步骤5:验证计划结果:

explain SELECT *  FROM hint_t1 t1 WHERE t1.a = 1;
SET
NOTICE:  Plan influenced by SQL hint patchid |                    operation                     | E-rows | E-width |    E-costs
----+--------------------------------------------------+--------+---------+---------------1 | ->  Index Scan using hint_t1_a_idx on hint_t1 t1 |     10 |      12 | 0.000..32.425
(1 row)Predicate Information (identified by plan id)
----------------------------------------------------1 --Index Scan using hint_t1_a_idx on hint_t1 t1Index Cond: (a = 1)
(2 rows)====== Query Others =====
---------------------------Bypass: Yes
(1 row)

执行计划结果:Plan influenct by SQL hint patch

步骤6:查看sql patch

csdn=> select * from dbe_sql_util.show_sql_patch('patch1');unique_sql_id | enable | abort |   hint_str
---------------+--------+-------+---------------868389431 | t      | f     | indexscan(t1)
(1 row)csdn=>

步骤7:禁用sql patch

csdn=> select * from dbe_sql_util.disable_sql_patch('patch1');disable_sql_patch
-------------------t
(1 row)csdn=>

步骤8:验证禁用之后sql patch

csdn=> explain SELECT *  FROM hint_t1 t1 WHERE t1.a = 1;id |                  operation                   | E-rows | E-width |    E-costs
----+----------------------------------------------+--------+---------+---------------1 | ->  Bitmap Heap Scan on hint_t1 t1           |     10 |      12 | 4.328..14.8832 |    ->  Bitmap Index Scan using hint_t1_a_idx |     10 |       0 | 0.000..4.325
(2 rows)Predicate Information (identified by plan id)
-----------------------------------------------1 --Bitmap Heap Scan on hint_t1 t1Recheck Cond: (a = 1)2 --Bitmap Index Scan using hint_t1_a_idxIndex Cond: (a = 1)
(4 rows)csdn=>

http://www.dtcms.com/a/347025.html

相关文章:

  • MSPM0G3507环境搭建
  • 【基础-判断】设计师在设计动效时,点击响应性、运动帧率、跟手性不需要设定,根据不同机型的性能能力系统设定即可
  • 以太坊智能合约地址派生方式:EOA、CREATE 和 CREATE2
  • 水泉村信息化服务小程序的设计与实验
  • kettle从入门到精通 第105课 ETL之kettle 解决api接口无返回页数和记录数的分页问题
  • 1.10 本地模型调用编码实战(一)
  • Flink框架:算子链的介绍
  • 梯度下降(线性回归为例)
  • 深度学习入门:神经网络
  • 【KO】前端面试题六
  • Idea中 lombok 在“测试类中-单元测试”运行失败及解决方法
  • 怎样避免游戏检测到云手机?
  • C++矩阵类设计与实现:高效、健壮的线性代数工具
  • 文字学的多维透视:从符号系统到文化实践
  • 解密 Kubernetes 权限管理:supplementalGroups 的魔力与 fsGroup 的选择
  • Linux服务器systemd服务配置详细指南
  • 【线程池】ThreadPoolTaskExecutor和redis的配置案例
  • 《UE教程》第一章第十一回——UE5.6打包安卓
  • Python 字符串查找,计数,判断,修改
  • Linux服务器利用Systemd配置定时任务
  • 手机横屏适配方案
  • Python 实战:内网渗透中的信息收集自动化脚本(2)
  • Python爬虫实战:构建港口物流数据采集和分析系统
  • 英伟达显卡GPU驱动的本质
  • Ubuntu 的 apt-get 强制使用 IPv4 网络
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(九)数值拖拽控件、进度条、滑动条
  • JupyterLab在线调试实验室
  • 【C语言16天强化训练】从基础入门到进阶:Day 7
  • 【Github】SourceTree远端链接Github
  • 173-基于Flask的微博舆情数据分析系统