云数据库 GAUSSDB-查看计划跳变历史:功能描述
功能描述
GaussDB 当前已有慢查询相关视图,并具备了SPM的基础能力。然而,当发生计划跳变时,无法对非慢查询的执行计划进行历史记录。因此,本特性在基于SPM的基础上,对历史执行计划进行记录,以提升SPM的易用性。由于SPM当前仅支持Generic-Plan,因此本功能所管理的计划类型限定在Generic-Plan。
当前计划跳变存在两种主要情况:
- 优化器对相同查询产生了不同的执行计划,并最终选用了新的计划。
- 每次执行时,优化器在历史已有的计划中切换。
这两种事件,均被称为跳变事件。
由于本特性涉及对计划跳变的快速感知和快速恢复两部分,以下将分别进行简明介绍。
- 快速感知
如果要实现全量的计划跳变历史记录,最直接的方法是记录每次执行计划与上一次的不同。这种方法会带来极大的性能开销。因此,出于性能和资源的考虑,本特性在以下两种场景进行跳变事件记录:
- 当优化器产生了SPM的baseline中不存在的新的计划。
- 当优化器产生了SPM的baseline中存在的,但超过一段时间未执行的老计划。
具体的执行流程,如图1所示。
此特性需要保证GUC参数spm_enable_plan_capture设置为STORE模式,且打开跳变历史记录开关spm_enable_plan_history_logging。
从图1可知,除了以下情况,均会对因产生新计划导致的跳变事件进行记录。
- 场景一:如果当前所捕获的基线个数已经超出上限 (spm_plan_capture_max_plannum),则查看当前计划是否是SPM所捕获过的查询的新计划。当前spm_enable_plan_history_logging打开并且历史记录数未超过上限,则进行额外的基线捕获,并进行历史记录。
- 场景二:如果当前所记录的跳变事件个数已经超出上限 (spm_plan_capture_max_plannum),则不进行历史记录。
为了确保在长期运行中能够记录更多的跳变历史,SPM会设置定时任务,在数据库启动起的每24小时触发一次历史记录清理,其校验准则是查看当前的历史记录数占最大上限的百分比,若超出此百分比,则会删除一些最旧的历史记录以保证记录数在此百分比要求之下,此百分比由spm_plan_history_reserved_percentage设置。
- 快速恢复
当发生计划跳变时,可以通过设置历史时间点的某条计划相应的baseline状态为ACC/FIXED,再结合计划选择功能spm_enable_plan_selection,即可实现回退至历史计划完成计划固化,也即完成快速回退。