暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

sql patch实际应用

roman 2025-07-20
133

一、sql patch介绍

SQL PATCH主要设计给DBA、运维人员及其他需要对SQL进行调优的角色使用,用户通过其他运维视图或定位手段识别到业务语句存在计划不优导致的性能问题时,可以通过创建SQL PATCH对业务语句进行基于Hint的调优。目前支持行数、扫描方式、连接方式、连接顺序、PBE custom/generic计划选择、语句级参数设置、参数化路径的Hint。此外,对于部分由特定语句触发系统内部问题导致系统可服务性受损的语句,在不对业务语句变更的情况下,也可以通过创建用于单点规避的SQL PATCH,对问题场景提前报错处理,避免更大的损失。

二、开启SQL跟踪

设置track_stmt_stat_level开启全量 SQL 跟踪 

  • 开启后,会跟踪全量SQL,后续查询dbe_perf.statement_history视图
$ gsql -r -d postgres
gsql ((PanWeiDB_V2.0-S3.1.1_B01) compiled at 2025-04-09 16:51:43 commit d653354 )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
postgres=# show track_stmt_stat_level;
 track_stmt_stat_level 
-----------------------
 OFF,L1
(1 row)
postgres=# set track_stmt_stat_level ='L1,L1';
SET
postgres=# show track_stmt_stat_level;
 track_stmt_stat_level 
-----------------------
 L1,L1
(1 row)

三、测试场景

执行SQL(SQL1的hint在子查询中,SQL2的hint在子查询外)

– SQL1:
image.png

– SQL2:
image.png

通过dbe_perf.statement_history视图,查看历史 SQL 执行计划
– 进入postgres库下查看,只可在系统库postgres中查询到结果,用户库中无法查询。

image.png
image.png

  • RECORD 25,无法显示具体的hint文本;
  • RECORD 26,可以显示具体的hint文本;注意,SQL2再次执行后,query也只显示上次的hint文本。

四、sql patch绑定

进入业务库中绑定

$ gsql -r -d xxxx
select * from dbe_sql_util.create_hint_sql_patch('patch20250424',3688099313,'Set(enable_bitmapscan off) Set(enable_seqscan off)');
select * from dbe_sql_util.show_sql_patch('patch20250424'); --删除:DBE_SQL_UTIL.drop_sql_patch
 unique_sql_id | enable | abort |                      hint_str                      
---------------+--------+-------+----------------------------------------------------
    3688099313 | t      | f     | Set(enable_bitmapscan off) Set(enable_seqscan off)
(1 row)

– patch20250424:PATCH名称
– 3688099313:unique_sql_id,全局唯一ID
– Set(enable_bitmapscan off) Set(enable_seqscan off):Hint文本

验证效果
– 不加hint,执行原始sql,如下,耗时为226ms,达到预计的效果(本初暂不贴出实际sql)
image.png

查看带hint的sql执行,执行计划结果中提示“Plan influenced by SQL hint patch”,说明sql patch生效。
a、hint在子查询内能生效,耗时219ms,如下:
image.png
b、hint在子查询外能生效,耗时217ms,如下:
image.png

此外,在重启、重新收集统计信息、清理cache后,sql patch依然生效。
(暂不提供截图)

五、总结:
SQL存在子查询时,hint在子查询里边,通过dbe_perf.statement_history视图无法显示具体的hint文本,无法使用sql patch绑定。hint在子查询外边,能正常使用sql patch绑定。

最后修改时间:2025-07-20 20:41:06
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论