クエリフィードバック
このトピックでは、クエリフィードバック機能、その適用シナリオ、および Query Plan Advisor を使用して実行統計からのフィードバックに基づいてクエリプランを最適化する方法を紹介します。
StarRocks は v3.4.0 以降でクエリフィードバック機能をサポートしています。
概要
クエリフィードバックは、コストベースオプティマイザ (CBO) のフレームワークであり、重要なコンポーネントです。クエリ実行中に実行統計を記録し、類似したクエリプランを持つ後続のクエリで再利用して、CBO が最適化されたクエリプランを生成するのを支援します。CBO は推定統計に基づいてクエリプランを最適化するため、統計情報が古いまたは不正確な場合、非効率的なクエリプラン(悪いプラン)を選択する可能性があります。たとえば、大きなテーブルをブロードキャストしたり、左と右のテーブルの順序を誤ったりすることがあります。これらの悪いプランは、クエリ実行のタイムアウト、過剰なリソース消費、さらにはシステムクラッシュを引き起こす可能性があります。
ワークフロー
クエリフィードバックに基づくプラン最適化のワークフローは、3 つのステージで構成されています。
- 観察: BE または CN は、各クエリプランの PlanNode の主要なメトリクス(
InputRows
とOutputRows
を含む)を記録します。 - 分析: 設定されたしきい値を超える遅いクエリや手動で分析対象としてマークされたクエリについて、クエリが終了し結果が返される前に、システムは重要なノードでの実行詳細を分析し、現在のクエリプランでの最適化の機会を特定します。FE はクエリプランを実行統計と比較し、異常なクエリプランによって引き起こされた遅いクエリかどうかを確認します。FE が不正確な統計を分析する際、各クエリに対して SQL チューニングガイドを生成し、CBO にクエリを動的に最適化するよう指示し、パフォーマンスを向上させるための戦略を推奨します。
- 最適化: CBO が物理プランを生成した後、そのプランに適用可能な既存のチューニングガイドを検索します。もし存在する場合、CBO はガイドと戦略に従ってプランを動的に最適化し、問題のあるセクションを修正し、悪いクエリプランの繰り返し使用によるクエリパフォーマンスへの影響を排除します。最適化されたプランの実行時間は、元のプランの実行時間と比較され、チューニングの効果が評価されます。
使用法
システム変数 enable_plan_advisor
(デフォルト: true
)によって制御される Query Plan Advisor は、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";
現在の FE 上のすべてのチューニングガイドをクリアする
現在の FE 上のすべてのチューニングガイドをクリアするには、以下のステートメントを実行します。
TRUNCATE PLAN ADVISOR