获取优化建议

可以调用 ANALYZE_WORKLOAD 以获取有关查询和数据库对象的优化建议。使用函数实参指定要分析哪些事件以及何时进行分析。

设置分析范围和时间范围

ANALYZE_WORKLOADscope 实参确定要分析的内容:

可选 since‑time 实参用于指定从自 since‑time 开始的所有范围内事件返回值,并继续保持当前系统状态。如果省略 since_timeANALYZE_WORKLOAD 将返回有关自记录的上次调用函数的时间以来的事件的建议。必须将 since‑time 字符串值显式转换为 TIMESTAMPTIMESTAMPTZ

以下示例显示了四种用不同格式表达 since‑time 实参的方法。对于自 2012 年 10 月 4 日以来表 t1 的工作负载,所有查询都返回相同的结果:

=> SELECT ANALYZE_WORKLOAD('t1', TIMESTAMP '2012-10-04 11:18:15');
=> SELECT ANALYZE_WORKLOAD('t1', '2012-10-04 11:18:15'::TIMESTAMPTZ);
=> SELECT ANALYZE_WORKLOAD('t1', 'October 4, 2012'::TIMESTAMP);
=> SELECT ANALYZE_WORKLOAD('t1', '10-04-12'::TIMESTAMPTZ);

保存函数结果

通过将 ANALYZE_WORKLOAD 的第二个实参设置为 true,可以保存该函数的结果,而无需分析自特定时间以来的事件。默认值为 false,且不保存任何结果。保存函数结果之后,ANALYZE_WORKLOAD 的随后调用仅分析自上次保存已返回的数据以来的事件,并忽略所有先前的事件。

例如,以下语句返回架构中所有数据库对象的建议,并记录此分析调用。

=> SELECT ANALYZE_WORKLOAD('', true);

下一次调用 ANALYZE_WORKLOAD 时,将分析自此点以后的事件。

观察值计数和时间

observation_count 列返回一个整数,表示工作负载分析器为此优化建议观察到的事件总数。对于上述每种情况,工作负载分析器都会提出第一项建议。observation_time 中的 Null 结果表示仅该建议来自当前系统状态,而不是来自之前的事件。

优化目标

tuning_parameter 列返回工作负载分析器建议您对其应用优化操作的对象。上述示例中的 release 参数通知 DBA 为用户版本设置密码。

优化建议和成本

工作负载分析器的输出将在 tuning_description 列返回您应当考虑的任务的简短描述并在适当时,在 tuning_command column 列返回可以运行的 SQL 命令。在上述记录 1 和 2 中,工作负载分析器建议您在两个表上运行 Database Designer,并建议在记录 3 中设置用户密码。注意,记录 3 还提供可运行的 ALTER USER 命令,因为优化操为 SQL 命令。

tuning_cost 列中的输出指示运行建议的优化命令所需的成本:

  • LOW:运行优化命令对资源的影响最小。可以随时执行优化操作,与上面的在 Record 3 中更改用户密码一样。

  • MEDIUM:运行优化命令对资源的影响适中。

  • HIGH:运行优化命令对资源的影响最大。根据数据库或表大小,考虑在非负载峰值时段执行开销较大的操作。

示例

以下语句要求工作负载分析器分析 locations 表的所有事件:

=> SELECT ANALYZE_WORKLOAD('locations');

工作负载分析器返回建议,建议您在表中运行 Database Designer。根据 locations 的大小,该操作可能会产生较高的成本:

-[ RECORD 1 ]----------+------------------------------------------------
observation_count      | 1
first_observation_time |
last_observation_time  |
tuning_parameter       | public.locations
tuning_description     | run database designer on table public.locations
tuning_command         |
tuning_cost            | HIGH

以下语句将分析今天之前一周以来 VMart 示例数据库中所有表上的工作负载:

=> SELECT ANALYZE_WORKLOAD('', NOW() - INTERVAL '1 week');

工作负载分析器返回以下结果:

-[ RECORD 1 ]----------+------------------------------------------------------
observation_count      | 4
first_observation_time | 2012-02-17 13:57:17.799003-04
last_observation_time  | 2011-04-22 12:05:26.856456-04
tuning_parameter       | store.store_orders_fact.date_ordered
tuning_description     | analyze statistics on table column store.store_orders_fact.date_ordered
tuning_command         | select analyze_statistics('store.store_orders_fact.date_ordered');
tuning_cost            | MEDIUM
-[ RECORD 2 ]---------+------------------------------------------------------
...
-[ RECORD 14 ]---------+-----------------------------------------------------
observation_count      | 2
first_observation_time | 2012-02-19 17:52:03.022644-04
last_observation_time  | 2012-02-19 17:52:03.02301-04
tuning_parameter       | SELECT x FROM t WHERE x > (SELECT SUM(DISTINCT x) FROM
                       | t GROUP BY y) OR x < 9;
tuning_description     | consider incremental design on query
tuning_command         |
tuning_cost            | HIGH

工作负载分析器发现两个问题:

  • 在记录 1 中,store.store_orders_fact table 中的 date_ordered 列可能具有过时的统计信息,因此工作负载分析器建议对该列运行 ANALYZE_STATISTICS。函数输出还会返回要运行的查询。例如:

    => SELECT ANALYZE_STATISTICS('store.store_orders_fact.date_ordered');
    
  • 在记录 14 中,工作负载分析器在 tuning_parameter 列中识别出性能欠佳的查询。建议使用 Database Designer 运行增量设计。工作负载分析器将潜在成本评定为 HIGH

系统表建议

还可以通过查询系统表 TUNING_RECOMMENDATIONS 获取优化建议,这样将从上一次 ANALYZE_WORKLOAD 调用返回优化建议结果。

=> SELECT * FROM tuning_recommendations;

工作负载分析器用于其建议的系统信息保留在 SQL 系统表中,因此查询 TUNING_RECOMMENDATIONS 系统表不会运行工作负载分析器。

另请参阅

收集数据库统计信息