管理查询计划

本文档介绍了如何使用 AlloyDB for PostgreSQL 中的查询计划管理功能来提升查询计划性能。查询计划管理会持续跟踪数据库中的所有查询计划及其执行统计信息。查看查询及相关费用后,您可以批准方案,该方案会持续应用于指定查询。这种方法可确保选择经济高效的查询计划,从而提高查询性能。

工作原理

在 PostgreSQL 中,查询优化器会根据估算的费用为每个查询选择执行计划。许多因素都会影响查询费用,例如查询参数、查询复杂程度、表大小、可用索引和系统资源。

由于查询参数可能会随着每次查询运行而发生变化,因此动态选择查询计划可能并不总是能产生最佳结果。在处理查询时,优化器会评估各种执行计划,并尝试选择最具成本效益的计划。

参数更改可能会导致方案更改。虽然所选方案通常是最具成本效益的选项,但有时可能会选择成本效益较低的方案,从而导致查询性能不佳。查询计划管理有助于您了解优化器生成的模式和计划,并让您查看每个计划,以便做出明智的决策。

查询计划管理有两个主要组成部分:

查询计划存储库
为数据库启用查询计划管理后,计划库会开始跟踪数据库的历史计划和执行统计信息。查询计划库可提供有关查询计划性能的可观测性。
方案管理
查看可用方案后,您可以使用方案管理组件批准特定查询模板的一个或多个方案。查询计划管理会跟踪这些已获批准的计划,并确保在后续执行查询时,查询优化器仅使用其中一个已获批准的计划。如果批准了多个计划,AlloyDB 会选择并执行估计成本最低的计划。

准备工作

  • google_plan_management.enabled 数据库标志设置为 on。如需了解详情,请参阅配置数据库标志
  • 在数据库中创建 google_plan_management 扩展程序。如需了解详情,请参阅启用扩展程序
  • 向想要使用查询计划管理功能和管理查询计划的数据库用户授予 google_plan_management_role 权限。

    1. 在 Google Cloud 控制台中,前往 AlloyDB 集群页面。

      转到集群

    2. 点击所需的实例。

    3. 点击 AlloyDB Studio,然后点击编辑器 1 标签页。

    4. 输入以下查询:

      GRANT google_plan_management_role TO DATABASE_USER;
      

      DATABASE_USER 替换为您要向其授予角色的用户。

    5. 点击运行

查看跟踪的查询计划

查询计划管理功能提供了一个查询计划视图,其中显示了所有跟踪的查询计划、它们的执行时间和其他信息。跟踪的查询计划是指由优化器生成并存储在计划库中的查询计划。

如需查看历史跟踪计划,请运行以下查询:

SELECT * FROM google_plan_management.tracked_plans_view;

查询响应类似于以下内容:

db_id                | 5
db_name              | postgres
user_id              | 16392
user_name            | postgres
logical_query_id     | 15480571796188147798
plan_id              | 4740866759615354783
query                | SELECT c1, c2, c3 FROM t1 WHERE c1 = 1;
plan                 | Seq Scan on public.t1                                                                                                                                                            +
                     |   Output: c1, c2, c3                                                                                                                                                             +
                     |   Filter: (t1.c1 = ?)
total_execution_time | 0.003937501
num_executions       | 1
creation_time        | 2024-11-06 16:52:25.200737+00
last_used_time       | 2024-11-06 16:52:25.200737+00

停用查询计划跟踪

如果您不希望查询计划管理功能跟踪优化器生成的查询计划,则必须停用 google_plan_management.enable_track_plans 数据库标志。此标志默认处于启用状态,建议您保持启用状态。如需了解详情,请参阅配置数据库标志

查看受管理的方案

您可以查看由查询计划管理功能管理的所有查询和计划,包括已获批准和遭拒的计划。

如需查看受管理的方案,请运行以下查询:

SELECT * FROM google_plan_management.managed_plans_view;

查询响应类似于以下内容:

db_id            | 5
db_name          | postgres
user_id          | 16392
user_name        | postgres
logical_query_id | 15480571796188147798
plan_id          | 4740866759615354783
status           | approved

批准方案

优化器会动态选择查询计划,这意味着它可能会在不同时间为同一查询选择不同的查询计划。为了强制执行一致的计划选择,您可以使用查询计划管理来批准给定查询的一个或多个查询计划。

如果您批准了多个计划,查询计划管理功能会比较所有已批准的计划,并选择最具成本效益的计划来执行查询。

如需评估和批准查询的执行计划,请按以下步骤操作:

  1. 查看优化器生成的跟踪方案,并确定回答中的 logical_query_id

  2. 查看为 logical_query_id 生成的所有方案。您可以使用 total_execution_timenum_executions 值计算每个方案的平均执行时间,然后确定查询的最佳方案。

    plan 列包含其他详细信息,例如所用的索引或排序方法,这些信息有助于您确定查询计划。

  3. 运行以下查询,批准要应用于查询的计划:

      SELECT google_plan_management.approve_plan(QUERY_ID, PLAN_ID);
    

    替换以下内容:

    • QUERY_ID:查询的唯一 logical_query_id。每个查询 ID 可能与多个方案 ID 相关联。
    • PLAN_ID:查询的唯一 plan_id

拒绝方案

您可以拒绝查询的任何已获批准的计划,并阻止查询计划管理功能将该计划应用于查询。被拒绝的方案不会被删除,并且会显示在跟踪方案列表中。

如需拒绝已获批准的方案,请运行以下查询:

    SELECT google_plan_management.deny_plan(QUERY_ID, PLAN_ID);

删除已获批准的方案

您可以从方案库中删除已获批准的方案。删除已获批的方案后,该方案将不再显示在受管理的方案列表中。

如需删除已获批的方案,请运行以下查询:

    SELECT google_plan_management.update_plan_status(QUERY_ID, PLAN_ID, 'delete');

暂时停止使用已获批的方案

如果您想暂时停止为查询使用获批的执行计划,则必须停用 google_plan_management.enable_steer_plans 数据库标志。默认情况下,此标志处于启用状态。如需了解详情,请参阅配置数据库标志

限制

  • 您无法在分区表或分组集中使用查询计划管理。
  • 查询计划管理仅在主实例上受支持。
  • 查询计划存储库最多可存储 10 万个唯一计划,并且不提供保留政策。

后续步骤