Aurora PostgreSQL 查询计划管理 - Amazon Aurora

Aurora PostgreSQL 查询计划管理

为 Aurora PostgreSQL 数据库集群开启查询计划管理后,优化程序会为其多次处理的任何 SQL 语句生成和存储查询执行计划。优化程序始终将托管式语句首次生成的计划的状态设置为 Approved,并将它存储在 dba_plans 视图中。

为托管式语句保存的一组已批准计划称为其计划基准。随着应用程序运行,优化程序可能会为托管式语句生成其他计划。优化程序将其他捕获的计划的状态设置为 Unapproved

稍后,您可以确定 Unapproved 计划的执行是否良好,并将其更改为 ApprovedRejectedPreferred。为此,您可以使用 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 托管式计划。在该节中,您可以了解到如何在实际使用计划之前使用 EXPLAINEXPLAIN ANALYZE 预览计划。有关详细信息,请参阅分析优化程序的已选择计划。有关概述选择计划的过程的图像,请参阅 优化程序如何选择要运行的计划