pgSQL的执行计划篡改

篡改SQL

1、SaaS类业务, 非常复杂的SQL, 数据库自动生成的执行计划不准确导致性能下降严重, 希望固定一种更好的执行计划解决性能问题.

2、分析型的SQL, 非常复杂, 而且数据经常大批量变化, 在收集完统计信息前后跑的SQL执行计划完全不准确. 希望通过固定执行计划来解决因为统计信息不准导致的SQL执行计划不准确的问题.

3、希望在执行SQL的同时自动触发执行其他的SQL, 例如对非常重要的表进行DML操作后, 立即发出NOTIFY消息, 上报告警. 或记录更新的内容.

方法(汇总)

sr_plan:

  1. 可以保存 查询 的执行计划,支持绑定变量的查询,也允许篡改执行计划。
  2. 针对每一条保存的执行计划,允许单独开启或关闭。
  3. 原理:通过post_parse_analyze_hook获取parser后的text并保存到sr_plan的query字段中,通过planner_hook保存,处理,返回保存的执行计划。
  4. 篡改执行计划需要执行替换的语句,举例:
    update sr_plans set plan=(select plan from sr_plans where query_hash=1956817209) where query_hash=1668453880;
    并允许QUERY使用sr_plan保存的执行计划:
    update sr_plans set enable=true where query_hash=1668453880;

pg_hint_plan.enable_hint_table
pg_hint_plan插件可以用Hint来强制干预和调优SQL语句的执行计划,并注册调优后的SQL语句模板和Hint,后续遇到相同SQL语句模板(常数参数数值不同,其它值都相同)的SQL语句将自动生成调优后的执行计划,从而提高执行效率。
支持版本:9.2及其以上版本


pg_query_rewrite
代码路径:https://github.com/pierreforstmann/pg_query_rewrite.git
pg_query_rewrite是一个PostgreSQL扩展,它允许将给定的源SQL语句转换为另一个预定义的SQL语句。
支持版本:pg_query_rewrite

你可能感兴趣的:(sql)