Aurora PostgreSQL 查询计划管理
为 Aurora PostgreSQL 数据库集群开启查询计划管理后,优化程序会为其多次处理的任何 SQL 语句生成和存储查询执行计划。优化程序始终将托管式语句首次生成的计划的状态设置为 Approved
,并将它存储在 dba_plans
视图中。
为托管式语句保存的一组已批准计划称为其计划基准。随着应用程序运行,优化程序可能会为托管式语句生成其他计划。优化程序将其他捕获的计划的状态设置为 Unapproved
。
稍后,您可以确定 Unapproved
计划的执行是否良好,并将其更改为 Approved
、Rejected
或 Preferred
。为此,您可以使用 apg_plan_mgmt.evolve_plan_baselines
函数或 apg_plan_mgmt.set_plan_status
函数。
当优化程序为 SQL 语句生成计划时,查询计划管理会将该计划保存在 apg_plan_mgmt.plans
表中。已被授予 apg_plan_mgmt
角色的数据库用户可以通过查询 apg_plan_mgmt.dba_plans
视图来查看计划详细信息。例如,以下查询列出了非生产 Aurora PostgreSQL 数据库集群的视图中当前计划的详细信息。
sql_hash
– SQL 语句的标识符,它是 SQL 语句的标准化文本的哈希值。plan_hash
– 计划的唯一标识符,它是sql_hash
和计划的哈希值的组合。status
– 计划的状态。优化程序可以运行已批准的计划。enabled
– 指示计划是否准备就绪,可供使用(true)或不可以使用(false)。plan_outline
– 计划的表示,用于重新创建实际的执行计划。树结构中的运算符映射到 EXPLAIN 输出中的运算符。
apg_plan_mgmt.dba_plans
视图具有更多的列,其中包含计划的所有详细信息,例如上次使用计划的时间。有关完整的详细信息,请参阅 Aurora PostgreSQL 兼容版的 apg_plan_mgmt.dba_plans 视图参考。
标准化和 SQL 哈希
在 apg_plan_mgmt.dba_plans
视图中,您可以通过 SQL 哈希值来确定托管式语句。SQL 哈希以 SQL 语句的标准化表示形式进行计算,消除了一些差异(例如文本值)。
每条 SQL 语句的标准化过程都会保留空格和大小写,以便您仍然可以阅读和理解 SQL 语句的要点。标准化会删除或替换以下项目。
前导块注释
EXPLAIN 关键字和 EXPLAIN 选项,以及 EXPLAIN ANALYZE
尾随空格
所有文本
以下面的语句为例。
/*Leading comment*/ EXPLAIN SELECT /* Query 1 */ * FROM t WHERE x > 7 AND y = 1;
查询计划管理按以下所示对此语句进行标准化:
SELECT /* Query 1 */ * FROM t WHERE x > CONST AND y = CONST;
标准化允许使用相同的 SQL 哈希来处理可能只有文本值或参数值不同的相似 SQL 语本。换句话说,同一个 SQL 哈希可能存在多个计划,在每种不同的条件下都有一个最优计划。
注意
用于不同模式的单个 SQL 语句具有不同的计划,因为它在运行时绑定到特定的模式。计划程序使用有关模式绑定的统计数据来选择最优计划。
要了解有关优化程序如何选择计划的更多信息,请参阅 使用 Aurora PostgreSQL 托管式计划。在该节中,您可以了解到如何在实际使用计划之前使用 EXPLAIN
和 EXPLAIN ANALYZE
预览计划。有关详细信息,请参阅分析优化程序的已选择计划。有关概述选择计划的过程的图像,请参阅 优化程序如何选择要运行的计划。