捕获执行计划 - Amazon Aurora
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

捕获执行计划

您可以使用手动计划捕获为特定的 SQL 语句捕获执行计划。或者,您可以使用自动计划捕获来捕获应用程序运行时多次执行的所有(或者速度最慢、或者最不稳定)计划。

捕获计划时,优化程序将托管语句首次捕获的计划的状态设置为 approved。优化程序将为托管语句捕获的任何其他计划的状态设置为 unapproved。但是,有时可能有多个计划保存为 approved 状态。在为一个语句并行创建了多个计划并在提交语句的第一个计划之前,可能发生这种情况。

要控制可以捕获并存储在 dba_plans 视图中的最大计划数量,请在数据库实例级参数组中设置 apg_plan_mgmt.max_plans 参数。对 apg_plan_mgmt.max_plans 参数的更改需要重启数据库实例以使新值生效。有关更多信息,请参阅 apg_plan_mgmt.max_plans 参数。

手动捕获特定 SQL 语句的计划

如果您已知要管理的 SQL 语句集,请将语句放入 SQL 脚本文件,然后手动捕获计划。下面显示了如何为 SQL 语句集手动捕获查询计划的 psql 示例。

psql> SET apg_plan_mgmt.capture_plan_baselines = manual; psql> \i my-statements.sql psql> SET apg_plan_mgmt.capture_plan_baselines = off;

在捕获各个 SQL 语句的计划之后,优化程序添加新行到 apg_plan_mgmt.dba_plans 视图。

我们建议您在 SQL 脚本文件中使用 EXPLAIN 或 EXPLAIN EXECUTE 语句。请确保在参数值中加入足够的变体以捕获所有感兴趣的计划。

如果您知道比优化程序最低成本计划更好的计划,则可以强制优化程序使用更好的计划。要这样做,请指定一个或多个优化程序提示。有关更多信息,请参阅 使用 pg_hint_plan 修复计划。要比较 unapprovedapproved 计划的性能并批准、拒绝或删除它们,请参阅评估计划性能

自动捕获计划

对于类似以下的情况,请使用自动计划捕获:

  • 您不知道要管理的具体 SQL 语句。

  • 您有数百乃至数千个 SQL 语句需要管理。

  • 您的应用程序使用客户端 API。例如,JDBC 使用未命名的预编译语句或者批量模式语句,无法在 psql 中表达。

自动捕获计划

  1. 通过在数据库实例级参数组中将 apg_plan_mgmt.capture_plan_baselines 设置为 automatic 来启用自动计划捕获。有关更多信息,请参阅修改数据库参数组中的参数

  2. 重新启动您的数据库实例。

  3. 随着应用程序运行,优化程序捕获各个至少运行两次的 SQL 语句的计划。

    随着应用程序使用默认查询计划管理参数设置运行,优化程序捕获各个至少运行两次的 SQL 语句的计划。在使用默认值的同时捕获所有计划具有非常小的运行时开销,并且可在生产中启用。

    您可以修改一些参数来捕获对吞吐量具有最大影响的语句、运行时间最长的语句或者性能最不稳定的语句。但是,这种自动计划捕获的扩展模式具有明显的性能开销。

禁用自动计划捕获

  • 从数据库实例级参数组,将 apg_plan_mgmt.capture_plan_baselines 参数设置为 off

要评估未批准计划的性能并批准、拒绝或删除这些计划,请参阅评估计划性能