查询反馈
Experimental feature
本主题介绍查询反馈功能、其应用场景,以及如何基于执行统计信息使用查询计划顾问优化查询计划。
StarRocks 从 v3.4.0 开始支持查询反馈功能。
概述
查询反馈是一个框架,也是CBO优化器的关键组件。它在查询执行期间记录执行统计信息,并在后续具有类似查询计划的查询中重用这些信息,以帮助CBO生成优化的查询计划。CBO基于估计的统计信息优化查询计划,因此当统计信息过时或不准确时,可能会选择低效的查询计划(坏计划),例如广播大表或错误排序左右表。这些坏计划可能导致查询执行超时、资源消耗过多,甚至系统崩溃。
工作流程
基于查询反馈的计划优化工作流程包括三个阶段:
- 观察:BE或CN记录每个查询计划中PlanNode的主要指标(包括
InputRows
和OutputRows
)。 - 分析:对于超过配置阈值的慢查询和手动标记为需要分析的查询,系统将在查询完成后、结果返回前分析关键节点的执行细节,以识别当前查询计划中的优化机会。FE将查询计划与执行统计信息进行比较,并检查查询是否由于异常查询计划导致慢查询。在分析不准确的统计信息时,FE会为每个查询生成SQL调优指南,指导CBO动态优化查询,并推荐提高性能的策略。
- 优化:在CBO生成物理计划后,它将搜索适用于该计划的现有调优指南。如果存在,CBO将根据指南和策略动态优化计划,纠正问题部分,从而消除由于重复使用坏查询计划对查询性能的影响。优化计划的执行时间与原始计划进行比较,以评估调优的有效性。
用法
受系统变量enable_plan_advisor
(默认值:true
)控制,查询计划顾问默认对慢查询启用,即执行时间超过FE配置项slow_query_analyze_threshold
(默认值:5
秒)的查询。
此外,您可以手动分析特定查询或为所有执行的查询启用自动分析。
手动分析特定查询
即使执行时间未超过slow_query_analyze_threshold
,您也可以手动分析特定查询语句。
ALTER PLAN ADVISOR ADD <query_statement>
示例:
ALTER PLAN ADVISOR ADD SELECT COUNT(*) FROM (
SELECT * FROM c1_skew_left_over t1
JOIN (SELECT * FROM c1_skew_left_over WHERE c1 = 'c') t2
ON t1.c2 = t2.c2 WHERE t1.c1 > 'c' ) t;
为所有查询启用自动分析
要为所有查询启用自动分析,您需要将系统变量enable_plan_analyzer
(默认值:false
)设置为true
。
SET enable_plan_analyzer = true;
显示当前FE上的调优指南
每个FE维护其自己的调优指南记录。您可以使用以下语句查看当前FE上为授权查询生成的调优指南:
SHOW PLAN ADVISOR
检查调优指南是否生效
对查询语句执行EXPLAIN。在EXPLAIN字符串中,消息Plan had been tuned by Plan Advisor
表示已对相应查询应用了调优指南。
示例:
EXPLAIN SELECT COUNT(*) FROM (
SELECT * FROM c1_skew_left_over t1
JOIN (SELECT * FROM c1_skew_left_over WHERE c1 = 'c') t2
ON t1.c2 = t2.c2 WHERE t1.c1 > 'c' ) t;
+-----------------------------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------------------------+
| Plan had been tuned by Plan Advisor. |
| Original query id:8e010cf4-b178-11ef-8aa4-8a5075cec65e |
| Original time cost: 148 ms |
| 1: LeftChildEstimationErrorTuningGuide |
| Reason: left child statistics of JoinNode 5 had been overestimated. |
| Advice: Adjust the distribution join execution type and join plan to improve the performance. |
| |
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:9: count |
| PARTITION: UNPARTITIONED
删除特定查询的调优指南
您可以根据SHOW PLAN ADVISOR
返回的查询ID删除特定查询的调优指南。
ALTER PLAN ADVISOR DROP <query_id>
示例:
ALTER PLAN ADVISOR DROP "8e010cf4-b178-11ef-8aa4-8a5075cec65e";