メインコンテンツまでスキップ
に最終更新

ヒントによるコストベースの書き換え用 CBO ルールの制御

事前確認​

  • Doris オプティマイザの基本的な処理の流れを理解している
  • 特定のクエリで、集約のプッシュダウンなどの CBO ルールを有効化する必要がある
  • 一般的な業務アプリケーション開発者ではなく、DBA またはチューニングの専門担当者である
注意

Doris は標準で高い最適化能力を備え、ほとんどの場面で性能を適応的に最適化するため、ヒントを使った手動チューニングが必要になることはまれです。この記事は主にチューニングの専門担当者を対象としています。業務アプリケーションの利用者は、概念を理解するだけで十分です。

概要​

USE_CBO_RULE は、単一の SQL 文の中で指定した CBO のコストベース書き換えルールを明示的に有効化するクエリヒントです。

Doris オプティマイザは、実行プランを生成する際に二種類のルールを適用します。

最適化の種類正式名称判断基準代表的な手法
RBORule-Based Optimizer統計情報に依存しない、事前定義されたヒューリスティックルール述語のプッシュダウン、射影のプッシュダウン
CBOCost-Based Optimizerデータの統計情報を基にコストを推定し、最もコストの低いプランを選択アクセスパスの選択、結合アルゴリズムの選択

細かなチューニングが必要な場合、DBA や開発者が CBO ルールを有効にするかどうかを手動で制御することがあります。その場合はクエリヒントを使用できます。

構文​

目的: 単一の SELECT 文で一つ以上の CBO ルールを明示的に有効化します。

コマンド:

SELECT /*+ USE_CBO_RULE(rule1, rule2, ...) */ ...

注意事項:

  • ヒントは SELECT キーワードの直後に配置します。
  • 括弧内に有効化するルール名を列挙します。複数ある場合はコンマで区切ります。
  • ルール名は大文字と小文字を区別しません。

サポートされる CBO ルール​

Doris オプティマイザでは現在、USE_CBO_RULE で明示的に有効化できるコストベースの書き換えルールとして、次のルールをサポートしています。

ルール名効果
PUSH_DOWN_AGG_THROUGH_JOIN集約処理を結合の両側にプッシュダウンします
PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE集約処理を結合の片側にプッシュダウンします
PUSH_DOWN_DISTINCT_THROUGH_JOINDistinct 処理を結合の下にプッシュダウンします

使用例: 集約のプッシュダウンによる結合クエリの高速化​

場面: テーブル a とテーブル b を device_id で結合し、その結果を event_id と group_id で集約します。結合が処理するデータ量を減らすため、結合前にテーブル a を集約します。

SQL の例:

explain shape plan
select /*+ USE_CBO_RULE(push_down_agg_through_join_one_side) */
a.event_id,
b.group_id,
COUNT(a.event_id)
from a
join b on
a.device_id = b.device_id
group by
a.event_id,
b.group_id
;

書き換え後の実行プラン:

PhysicalResultSink
--hashAgg[GLOBAL]
----hashAgg[LOCAL]
------hashJoin[INNER_JOIN] hashCondition=((a.device_id = b.device_id)) otherCondition=()
--------hashAgg[LOCAL]
----------PhysicalOlapScan[a]
--------filter((cast(experiment_id as DOUBLE) = 73.0))
----------PhysicalOlapScan[b]

追加の hashAgg[LOCAL] がテーブル a のスキャンの上に配置され、結合前に集約が行われていることが分かります。これにより結合への入力データ量が減り、クエリが高速化されます。

FAQ​

Q1: USE_CBO_RULE はどのような場合に使用しますか?

Doris が特定の CBO ルールをデフォルトで適用しない一方、現在のデータ分布ではそのルールが有効だと判断できる場合にのみ、手動で有効化する必要があります。ほとんどの場合は、オプティマイザの自動的な判断に任せてください。

Q2: ヒント内のルール名は大文字と小文字を区別しますか?

いいえ、区別しません。PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE と push_down_agg_through_join_one_side は同じ意味です。

Q3: 複数のルールを同時に有効化できますか?

はい。/*+ USE_CBO_RULE(rule1, rule2) */ のように、ルールをコンマで区切ります。

Q4: ヒントの位置が間違っている場合や、ルール名にスペルミスがある場合はどうなりますか?

ヒントは SELECT キーワードの直後に配置する必要があります。ルール名にスペルミスがある場合、ヒントは効果を発揮しませんが、SQL はデフォルトのプランで実行されます。

RBO と CBO の比較​

比較項目RBOCBO
判断基準ヒューリスティックルールデータの統計情報(コスト推定)
統計情報への依存いいえはい
適用場面一般的で、決定的な最適化データ分布に密接に関係する最適化
USE_CBO_RULE による制御できませんできます

まとめ​

USE_CBO_RULE ヒントを適切に使用すると、特定の場面で高度な CBO 最適化ルールを手動で有効化し、クエリ性能を改善できます。使いこなすには、クエリ最適化とデータの特性を深く理解する必要があります。ほとんどの場合は、Doris オプティマイザの自動的な判断に任せるのが最善です。