SQL PATCH
功能简介
SQL PATCH能够在避免直接修改用户业务语句的前提下对查询执行的方式做一定调整。在发现查询语句的执行计划、执行方式未达预期的场景下,可以通过创建查询补丁的方式,使用Hint对查询计划进行调优或对特定的语句进行报错短路处理。
功能描述
SQL PATCH主要设计给DBA、运维人员及其他需要对SQL进行调优的角色使用,用户通过其他运维视图或定位手段识别到业务语句存在计划不优导致的性能问题时,可以通过创建SQL PATCH对业务语句进行基于Hint的调优。目前支持行数、扫描方式、连接方式、连接顺序、PBE custom/generic计划选择、语句级参数设置、参数化路径的Hint。此外,对于部分由特定语句触发系统内部问题导致系统可服务性受损的语句,在不对业务语句变更的情况下,也可以通过创建用于单点规避的SQL PATCH,对问题场景提前报错处理,避免更大的损失。
SQL PATCH的实现当前基于Unique SQL ID,所以需要打开相关的运维参数才可以生效(详见注意事项),Unique SQL ID在WDR报告和慢SQL视图中都可以获取到,在创建SQL PATCH时需要指定Unique SQL ID。
注意事项
本特性依赖于资源实时监控功能,需要开启GUC参数enable_resource_track设置为on,并设置instr_unique_sql_count大于0。
需在配置文件postgre.conf中添加
track_stmt_stat_level='L1,L1'
。仅支持针对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生成方法可能变化,可能导致规避方法失效。
当前,除DML语句之外,其他SQL语句(如CREATE TABLE等)的Unique SQL ID是对语句文本直接哈希生成的,所以对于此类语句,SQL PATCH对大小写、空格、换行等敏感,即不同的文本的语句,即使语义相对,仍然需要对应不同的SQL PATCH。对于DML,则同一个SQL PATCH可以对不同入参的语句生效,并且忽略大小写和空格。
示例
示例1: 使用SQL PATCH对特定语句进行提前报错规避。
1、构建测试数据。
create table ht(id int,name varchar);
create unique index ht_index on ht(id);
insert into ht values(1,'joe'),(2,'bob'),(3,'jhon'),(4,'lily');
2、检查参数,需满足注意事项中的说明。
show track_stmt_stat_level;
show enable_resource_track;
show instr_unique_sql_count;
结果返回如下:
track_stmt_stat_level
-----------------------
L1,L1
(1 row)
enable_resource_track
-----------------------
on
(1 row)
instr_unique_sql_count
------------------------
100
(1 row)
3、执行语句生成Unique SQL ID。
select * from ht where id=1;
4、进入postgres库查询Unique SQL ID。
\c postgres
select unique_query_id, query, query_plan from dbe_perf.statement_history where query like '%ht%';
结果返回如下,其中unique_query_id即为Unique SQL ID:
unique_query_id | query | query_plan
-----------------+-----------------------------------------------+--------------------------------------------------------------------
3852458338 | select * from ht where id=?; | Datanode Name: node1 +
| | Index Scan using ht_index on ht (cost=0.00..8.27 rows=1 width=36)+
| | Index Cond: (id = '***') +
| |
(1 row)
5、进入vastbase库创建报错规避。
\c vastbase
select * from dbe_sql_util.create_abort_sql_patch('ht_ab_patch', 3852458338);
6、执行语句验证结果。
select * from ht where id=1;
结果返回如下:
ERROR: Statement 3852458338 canceled by abort patch ht_ab_patch
相关链接
SQL PATCH相关函数请参考DBE_SQL_UTIL Schema
系统表请参考GS_SQL_PATCH。