技术原理
核心机制
- 相同语句计划复用 图1 相同语句计划复用流程原理图
用户SQL语句经词法解析与语法解析后,对于相同的SQL语句计划实现复用。当用户第一次执行某SQL语句时,数据库对SQL语句进行语义解析及计划生成,同时将语义解析结果及计划根据SQL等关键信息作为键(Key)构建计划缓存哈希表,进行缓存。当后续遇到相同SQL文本的SQL语句(包括所有字面值、大小写、空格等都需相同)时,根据键(Key)从计划缓存哈希表中匹配计划缓存并直接复用相同的缓存计划,从而跳过重复的解析、优化等耗时阶段。
相较于非相同语句计划复用流程,相同语句计划复用增加了以下操作逻辑:
- 构造计划缓存键(Key)
- 使用键(Key)匹配计划
- 复用计划
- 存储键(Key)与执行计划相关信息
- 自动参数化 图2 自动参数化流程原理图
- 用户SQL语句经词法解析与语法解析生成原始语法树后,自动参数化模块将遍历语法树节点,对常量节点进行参数化。具体操作包括将常量节点转换为参数节点以及记录参数类型等信息。
- 根据参数化的节点信息生成SQL模板。
- 当某模板SQL首次执行时,数据库引擎基于参数化的语法树进行执行以下操作:
- 语义分析
- 计划生成
- 缓存计划
- 当再次执行相同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。 |