更新时间:2026-07-28 GMT+08:00
分享

技术原理

核心机制

  • 相同语句计划复用
    图1 相同语句计划复用流程原理图

    用户SQL语句经词法解析与语法解析后,对于相同的SQL语句计划实现复用。当用户第一次执行某SQL语句时,数据库对SQL语句进行语义解析及计划生成,同时将语义解析结果及计划根据SQL等关键信息作为键(Key)构建计划缓存哈希表,进行缓存。当后续遇到相同SQL文本的SQL语句(包括所有字面值、大小写、空格等都需相同)时,根据键(Key)从计划缓存哈希表中匹配计划缓存并直接复用相同的缓存计划,从而跳过重复的解析、优化等耗时阶段。

    相较于非相同语句计划复用流程,相同语句计划复用增加了以下操作逻辑:

    • 构造计划缓存键(Key)
    • 使用键(Key)匹配计划
    • 复用计划
    • 存储键(Key)与执行计划相关信息
  • 自动参数化
    图2 自动参数化流程原理图
    1. 用户SQL语句经词法解析与语法解析生成原始语法树后,自动参数化模块将遍历语法树节点,对常量节点进行参数化。具体操作包括将常量节点转换为参数节点以及记录参数类型等信息。
    2. 根据参数化的节点信息生成SQL模板。
    3. 当某模板SQL首次执行时,数据库引擎基于参数化的语法树进行执行以下操作:
      • 语义分析
      • 计划生成
      • 缓存计划
    4. 当再次执行相同SQL模板语句时,启用缓存复用机制(即后续相同模板SQL复用缓存计划)。

    相较于非参数化流程,自动参数化增加了以下操作逻辑:

    • 参数化语法树
    • 参数化SQL文本串
    • 构造计划缓存key
    • 使用键(Key)匹配计划
    • 复用计划
    • 存储键(Key)与执行计划相关信息
    • 绑定参数化常量信息执行

接口介绍

GUC参数名

GUC参数说明

cursor_sharing

控制自动参数化和相同语句计划复用功能开启。具体请参见《参考》中“数据库运行参数说明 > GUC参数说明 > 查询规划 > 其他优化器选项”章节。

Hint名

Hint说明

cursor_sharing_exact

指定单个SQL语句使用相同语句计划复用,其作用等同于cursor_sharing=exact。具体请参见《SQL调优指南》中“使用Plan Hint进行调优 > 指定cursor_sharing为exact的Hint”章节。

函数或视图名

函数或视图说明

DBE_PERF.GS_PLANCACHE_STAT

显示当前进程内全部session的可复用计划的语句信息,查看该视图需要初始用户或MONITORADMIN权限。

具体请参见《参考》中“Schema > DBE_PERF Schema > Query > DBE_PERF.GS_PLANCACHE_STAT”章节。

GS_ALL_PREPARED_STATEMENTS

视图新增is_reused字段表示该缓存是否被重用。

具体请参见《参考》中“系统表和系统视图 > 系统视图 > 其他系统视图 > GS_ALL_PREPARED_STATEMENTS”章节。

DBE_PERF.GLOBAL_PLANCACHE_STATUS

视图新增parameterized_info字段,表示该语句通过cursor_sharing的exact或force的流程执行。

具体请参见《参考》中“Schema > DBE_PERF Schema > Global Plancache > DBE_PERF.GLOBAL_PLANCACHE_STATUS”章节。

DBE_PERF.GS_DIST_PLANCACHE_STAT

显示全部进程(包含备机)的可复用计划的信息,查看该视图需要初始用户或MONITORADMIN权限。具体请参见《参考》中“Schema > DBE_PERF Schema > Query > DBE_PERF.GS_DIST_PLANCACHE_STAT”章节。

pg_catalog.gs_dist_plancache_stat()

查看包含备机的全部进程的可复用计划的语句信息的系统函数,函数返回信息和DBE_PERF.GS_DIST_PLANCACHE_STAT一致。查看该函数需要初始用户或MONITORADMIN权限。具体请参见《参考》中“SQL参考 > 函数和操作符 > 统计信息函数”章节。

pg_catalog.gs_plancache_stat()

查看当前进程内全部session的可复用计划的语句信息,函数返回信息和DBE_PERF.GS_PLANCACHE_STAT一致。查看该函数需要初始用户或MONITORADMIN权限。

具体请参见《参考》中“SQL参考 > 函数和操作符 > 统计信息函数”章节。

DBE_PERF.global_plancache_status(is_with_plan)

显示在所有节点上的全局计划缓存的状态信息,即plan_info列。入参is_with_plan为bool类型,默认值为false。当入参为true时,显示plan_info的信息。函数返回信息和DBE_PERF.GLOBAL_PLANCACHE_STATUS一致。具体请参见《参考》中“SQL参考 > 函数和操作符 > 统计信息函数”章节。

当设置GUC参数cursor_sharing = force时,启用自动参数化的场景下,通过EXPLAIN查看计划是否走自动参数化:

EXPLAIN模式

计划展示说明

normal/pretty

被参数化的计划会显示[Parameterized]的tag。

相关文档