Amazon Aurora
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 使用未命名的预编译语句或者批量模式语句,无法在 PostgreSQL SQL 中表达。

自动捕获计划

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

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

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

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

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

禁用自动计划捕获

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

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

您也可以根据语句的统计属性来确定自动捕获哪些 SQL 语句。有关更多信息,请参阅使用统计数据来确定 SQL 语句

使用统计数据来确定 SQL 语句

使用自动计划捕获,您可以通过语句的统计属性来确定要管理的 SQL 语句。要访问 SQL 语句统计信息,请安装 pg_stat_statements 扩展。

查询计划管理提供了访问这些统计信息的参数。您可以设置这些参数向优化程序提供标准,以便其确定要管理哪些 SQL 语句。在自动计划捕获期间,优化程序捕获满足统计标准的语句的计划。

使用以下参数定义您要管理的 SQL 语句的统计标准。

参数 说明
apg_plan_mgmt.pgss_min_calls 语句运行的次数。有关更多信息,请参阅 apg_plan_mgmt.pgss_min_calls 参数。
apg_plan_mgmt.pgss_min_total_time_ms 语句的总执行时间。有关更多信息,请参阅 apg_plan_mgmt.pgss_min_total_time_ms 参数。
apg_plan_mgmt.pgss_min_mean_time_ms 语句的平均执行时间。有关更多信息,请参阅 apg_plan_mgmt.pgss_min_mean_time_ms 参数。
apg_plan_mgmt.pgss_min_stddev_time_ms 语句的执行时间标准偏差。有关更多信息,请参阅 apg_plan_mgmt.pgss_min_stddev_time_ms 参数。

注意

如果使用这些统计信息来确定要管理哪些 SQL 语句,您的应用程序性能将会受到影响。

在您可以使用统计信息来确定要管理哪些语句之前,您需要安装 pg_stat_statements 扩展。有关安装和其他详细信息,请参阅 PostgreSQL pg_stats_statements 文档

以下过程介绍如何基于统计标准确定要管理的 SQL 语句,以及使用捕获计划自动捕获所有匹配的语句。

基于 SQL 语句统计数据捕获计划

注意

在数据库实例的参数组中,设置以下 apg_plan_mgmt 参数,然后重新启动数据库实例。有关参数组的更多信息,请参阅修改数据库参数组中的参数

  1. 通过将 apg_plan_mgmt.capture_plan_baselines 参数设置为 automatic,启用自动计划捕获。

  2. apg_plan_mgmt.use_plan_baselines 设置为 true 以强制优化程序在继续捕获更多计划时,使用托管计划。如果您仅希望捕获计划但尚不使用它们,请设置 false 的值。

  3. 设置统计标准以确定要管理哪些 SQL 语句。

    例如,将 apg_plan_mgmt.pgss_min_calls 设置为 3 会告知优化程序仅保存至少运行 3 次的语句的计划。将 apg_plan_mgmt.pgss_min_total_time_ms 设置为 30000 会告知优化程序保存运行 30 秒或更久的语句的计划。

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

  5. 启用 pg_stat_statements 扩展以使 SQL 语句的统计数据对此数据库实例可用。

    CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

随着应用程序运行,优化程序捕获各个匹配语句的计划。