1
SQL PATCH
特性约束
仅支持针对Unique SQL ID打PATCH,如果存在Unique SQL ID冲突,用于Hint调优的SQL PATCH可能影响性能,但不影响语义正确性。
仅支持不改变SQL语义的Hint作为PATCH,不支持SQL改写。
不支持逻辑备份、恢复。
不支持创建时校验PATCH合法性,如果PATCH的Hint存在语法或语义错误,不影响查询正确执行。
仅初始用户、运维管理员、监控管理员、系统管理员用户有权限执行;库之间不共享,创建SQL PATCH时需要连接目标库。
配置集中式备机可读时,需要指定主机执行SQL PATCH创建/修改/删除函数调用,备机执行报错。
SQL PATCH同步给备机存在一定延迟,待备机回放相关日志后PATCH生效。
不支持对存储过程中的SQL语句生效,当前机制不会对存储过程内语句生成Unique SQL ID。
用于规避的Abort Patch不建议在数据库中长期使用,只应该作为临时规避方法;遇到内核问题所导致的特定语句触发数据库服务不可用问题,需要尽快修改业务或升级内核版本解决问题;并且升级后由于Unique SQL ID生成方法可能变化,可能导致规避方法失效。
依赖关系
2
实际案例
create table t1(name char(10),id int);
create table t2(name char(10),id int);
INSERT INTO t1 (name, id)
SELECT 'data_'|| generate_series(1, 1000), generate_series(1, 1000);
INSERT INTO t2 (name, id)
SELECT 'data_'|| generate_series(1, 1000), generate_series(1, 1000);
CREATE INDEX idx_t1 ON t1 (id);
CREATE INDEX idx_t2 ON t2 (id);
set track_stmt_stat_level = 'L1,L1';
--track_stmt_stat_level解释:
该参数分为两部分:
--形式为'full sql stat level, slow sql stat level'。
--级别(L2 > L1 > L0),L1在L0的基础上记录了执行计划,L2在L1的基础上记录了锁的详细信息
select * from t1 a, t2 b where a.id = b.id;
name | id | name | id
------------+------+------------+------
data_1 | 1 | data_1 | 1
data_2 | 2 | data_2 | 2
data_3 | 3 | data_3 | 3
data_4 | 4 | data_4 | 4
data_5 | 5 | data_5 | 5
data_6 | 6 | data_6 | 6
data_7 | 7 | data_7 | 7
。。。。
(1000 row)
explain select * from t1 a, t2 b where a.id = b.id;
QUERY PLAN
--------------------------------------------------------------------------
Aggregate (cost=60.75..60.76 rows=1 width=8)
-> Hash Join (cost=28.50..58.25 rows=1000 width=0)
Hash Cond: (a.id = b.id)
-> Seq Scan on t1 a (cost=0.00..16.00 rows=1000 width=4)
-> Hash (cost=16.00..16.00 rows=1000 width=4)
-> Seq Scan on t2 b (cost=0.00..16.00 rows=1000 width=4)
select unique_query_id,query,start_time from dbe_perf.statement_history where query like '%from t1 a%';
unique_query_id | query | start_time
-----------------+----------------------------------------------------+-------------------------------
3366573496 | select * from t1 a, t2 b where a.id = b.id; | 2024-01-19 10:08:56.994391+08
也可以通过statement_history查询执行计划
select start_time,query_plan from dbe_perf.statement_history where unique_query_id = 3366573496;
start_time | query_plan
-------------------------------+--------------------------------------------------------------------------
2024-01-19 10:08:56.994391+08 | Datanode Name: dn_6001_6002 +
| Hash Join (cost=28.50..58.25 rows=1000 width=30) +
| Hash Cond: (a.id = b.id) +
| -> Seq Scan on t1 a (cost=0.00..16.00 rows=1000 width=15) +
| -> Hash (cost=16.00..16.00 rows=1000 width=15) +
| -> Seq Scan on t2 b (cost=0.00..16.00 rows=1000 width=15)+
| +
call dbe_sql_util.create_hint_sql_patch('enmo patch',3366573496,'indexscan(a)');
create_hint_sql_patch
-----------------------
t
(1 row)
--参数说明:
enmo patch --SQL PATCH name
3366573496 --unique_query_id
indexscan(a) --Hint文本
select * from t1 a, t2 b where a.id = b.id;
name | id | name | id
------------+------+------------+------
data_1 | 1 | data_1 | 1
data_2 | 2 | data_2 | 2
data_3 | 3 | data_3 | 3
data_4 | 4 | data_4 | 4
data_5 | 5 | data_5 | 5
data_6 | 6 | data_6 | 6
data_7 | 7 | data_7 | 7
。。。。
explain select * from t1 a, t2 b where a.id = b.id;
NOTICE: Plan influenced by SQL hint patch
QUERY PLAN
------------------------------------------------------------------------------
Hash Join (cost=28.50..86.50 rows=1000 width=30)
Hash Cond: (a.id = b.id)
Index Scan using idx_t1 on t1 a (cost=0.00..44.25 rows=1000 width=15)
patch生效
Hash (cost=16.00..16.00 rows=1000 width=15)
Seq Scan on t2 b (cost=0.00..16.00 rows=1000 width=15)
rows)
select query_plan,to_char(start_time,'yyyymmdd-hh24:mi:ss') starttime
from dbe_perf.statement_history
where unique_query_id = 3366573496
order by start_time;
Datanode Name: dn_6001_6002 +| 20240119-10:09:54
Hash Join (cost=28.50..86.50 rows=1000 width=30) +|
Hash Cond: (a.id = b.id) +|
-> Index Scan using idx_t1 on t1 a (cost=0.00..44.25 rows=1000 width=15)+|
-> Hash (cost=16.00..16.00 rows=1000 width=15) +|
-> Seq Scan on t2 b (cost=0.00..16.00 rows=1000 width=15) +|
+|
|
select patch_name,unique_sql_id,enable,hint_string from gs_sql_patch;
patch_name | unique_sql_id | enable | hint_string
------------+---------------+--------+--------------
enmo patch | 3366573496 | t | indexscan(a)
show_sql_patch查看SQL PATCH内容
MogDB=# select DBE_SQL_UTIL.show_sql_patch('enmo patch');
show_sql_patch
-------------------------------------
(3366573496,t,f,"indexscan(a)")
(1 row)
MogDB=# select * from dbe_sql_util.drop_sql_patch('enmo patch'); -- 删去enmo patch
drop_sql_patch
----------------
t
(1 row)
MogDB=# select * from dbe_sql_util.create_abort_sql_patch('patch2', 3366573496); -- 对该语句的Unique SQL ID创建Abort Patch
create_abort_sql_patch
------------------------
t
(1 row)
MogDB=# select * from t1 a, t2 b where a.id = b.id; -- 再次执行语句会提前报错
ERROR: Statement 3366573496 canceled by abort patch patch2
disable enmo patch
call dbe_sql_util.disable_sql_patch('enmo patch');
MogDB=# select query_plan,to_char(start_time,'yyyymmdd-hh24:mi:ss') starttime
MogDB-# from dbe_perf.statement_history
MogDB-# where unique_query_id = 3366573496
MogDB-# order by start_time;
query_plan | starttime
--------------------------------------------------------------------------+-------------------
Datanode Name: dn_6001_6002 +| 20240119-13:24:52
Nested Loop (cost=0.00..340.00 rows=1000 width=30) +|
-> Seq Scan on t1 a (cost=0.00..16.00 rows=1000 width=15) +|
-> Index Scan using idx_t2 on t2 b (cost=0.00..0.31 rows=1 width=15)+|
Index Cond: (id = a.id) +|
+|
|
Datanode Name: dn_6001_6002 +| 20240119-13:31:49
Hash Join (cost=28.50..58.25 rows=1000 width=30) +|
Hash Cond: (a.id = b.id) +|
-> Seq Scan on t1 a (cost=0.00..16.00 rows=1000 width=15) +|
-> Hash (cost=16.00..16.00 rows=1000 width=15) +|
-> Seq Scan on t2 b (cost=0.00..16.00 rows=1000 width=15) +|
+|
关于作者
许玉晨,云和恩墨 MogDB 技术支持工程师,有12年左右的金融、保险、政府、地税、运营商等业务关键型系统的运维经验,曾担任公司异常恢复东区接口人,负责紧急异常恢复工作,目前负责国产化MogDB数据库的推广工作。
数据驱动,成就未来,云和恩墨,不负所托!
云和恩墨创立于2011年,以“数据驱动,成就未来”为使命,是智能的数据技术提供商。我们致力于将数据技术带给每个行业、每个组织、每个人,构建数据驱动的智能未来。
云和恩墨在数据承载(分布式存储、数据持续保护)、管理(数据库基础软件、数据库云管平台、数据技术服务)、加工(应用开发质量管控、数据模型管控、数字化转型咨询)和应用(数据服务化管理平台、数据智能分析处理、隐私计算)等领域为各个组织提供可信赖的产品、服务和解决方案,围绕用户需求,持续为客户创造价值,激发数据潜能,为成就未来敏捷高效的数字世界而不懈努力。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!