自动 SQL 优化集
早在 Oracle 19.7 的时候引入了一个新的功能 – Automatic SQL Tuning Sets (ASTS),用于记录 SQL 历史执行计划和性能指标。ASTS 使用后台自动任务采集数据,在 19.7 中默认是打开的,虽然 ASTS 是常见的基础功能,对数据库的运行时行为没有任何影响(除了占用SYSAUX中的有限空间),但一些客户表示不希望在 RU 中默认启用此功能。因此,从 19.8 开始默认是禁用的,由用户自主决定是否开启该功能。
和 AWR 收集整体的系统资源状态不同,ASTS 侧重于 SQL 语句的执行计划和性能指标,对于诊断由于执行计划改变而导致 SQL 性能下降的场景非常有用。有了 ASTS 后,Oracle 进一步使用 SPM (SQL Plan Management) 对 STS 中的 SQL 进行分析,使得性能下降的 SQL 语句能够被及时发现和纠正,这就是我们今天要说的实时 SPM (Real Time SPM) 功能。
SQL 性能管理的演进
相信 Oracle DBA 对于 SPM 并不陌生,这是在 Oracle 11.1.0.6 版本中推出的一项新特性,旨在帮助数据库管理员及时发现性能衰减的 SQL,提升其执行效率。SPM 分析的数据来源有两种方式,一种是手工从共享池、AWR、SQL Tuning Set 或中间表中批量加载 SQL 执行计划;另一种是当设置 optimizer_capture_sql_plan_baselines = true 时 (默认为 false),系统会自动为多次执行的 SQL 语句建立基线。
上图展示了 SPM 具体的决策过程,当 SQL 语句在数据库中进行硬解析,优化器会基于当前的信息生成一个成本最低的执行计划。
- 基于生成的执行计划,优化器首先会判断该语句是否已经存在执行计划基线,如果没有则将当前执行计划做为最优计划直接执行;
- 如果语句已经存在执行计划基线,则会判断当前的执行计划是否已经在基线中,如果已经是基线则直接执行;
- 如果不是基线中则将当前执行计划标记为 UNACCEPTED 状态保存在执行计划历史中,将该计划和当前 ACCEPTED 的计划做比较,选择成本最低的执行计划作为新的基线。
以上是对于一条硬解析的 SQL,SPM 所发挥的基础功能,这个过程中不会对已经存在的基线做任何变更。那么对于已经存在基线的 SQL 语句,如果有比基线更好的执行计划呢,这时就需要更高级的 Plan Evolution 功能,SQL 执行计划演进就是优化器验证新的执行计划,并将其加入到已经存在的 SQL 基线的过程。这个过程包括以下两个阶段:
- 在计划验证阶段,确认 UNACCEPTED 的执行计划性能,至少不能比现有基线中已被接受的执行计划差;
- 经过验证的 UNACCEPTED 执行计划作为 ACCEPTED 计划被加入到执行计划基线中。
SQL 语句的基线总是由一个 ACCEPTED 计划开始的,但是当数据分布不均匀时,对于 A 来说最优的执行计划并不一定适合 B。有了 Plan Evolution 功能后,能够为这类语句构建出一个执行计划基线池,不同选择度的谓词会匹配到不同的执行计划上,使得优化器总是能够选择出最优的执行计划。
对于 12c 之前的版本,Plan Evolution 只能是手工发起。12c 中引入了一个新的后台任务,在维护窗口可以自动演进 SQL 计划基线,这个任务是由 DBMS_SPM.SET_EVOLVE_TASK_PARAMETER(task_name=>‘SYS_AUTO_SPM_EVOLVE_TASK’…) 来控制的,在 19c 更进一步,这个任务的执行不再受限于维护窗口,而变成完全自动的。自动 SPM 由 DBMS_SPM.CONFIGURE(‘AUTO_SPM_EVOLVE_TASK’…) 来控制,通过 DBMS_SPM.SET_EVOLVE_TASK_PARAMETER 可以进一步设置执行计划自动提升的详细配置,比如指定用于分析 SQL 优劣的数据来源、是否自动接受更优的执行计划等等。
至此,我们来总结一下自动 SPM 的演进过程,Oracle 逐步将 SPM 逐步进化为无人值守的 SQL 优化专家。
- 首先是在 11g 中引入了 SPM 功能,当参数开启时会自动为多次执行的 SQL 语句建立基线。对于需要演进提升的 SQL,需要管理员手工建立演进任务;
- 接下来在 12c 中引入了自动任务,在指定的维护窗口可以自动进行 SQL 执行计划的演进;
- 到了 19c Oracle 放开了自动任务的执行窗口限制,执行计划的演进可以实时进行,一旦发现立即处理。
写在最后
类似于 SPM,Oracle 有的很多功能都是这样的不断迭代进化的。比如 OMF (Oracle Managed Files) 最初只是在 10g 引入的一个新概念,刚推出来时也没觉得有什么很大的用途,但是在随后的版本中,Oracle 在 快速恢复区和 ASM 中广泛使用 OMF,使用这种方式能够从数据库层面实现数据文件、归档日志文件及闪回日志等的自动管理,不需要从操作系统上再去对数据库相关文件进行手工操作,一方面提高了管理效率,另一方面也避免从外部操作数据库文件,大大降低了运维风险。