メインコンテンツまでスキップ
バージョン: 26.x

Hintを使用したCBOルールの制御

概要

クエリオプティマイザーは実行計画を生成する際に一連のルールを適用します。これらのルールは主に2つのタイプに分類されます:Rule-Based Optimizer (RBO)とCost-Based Optimizer (CBO)です。

  • RBO: このタイプの最適化は、特定のデータ統計を考慮せずに、事前定義されたヒューリスティックルールセットを適用することでクエリ計画を改善します。predicate pushdownやprojection pushdownなどの戦略がこのカテゴリに含まれます。
  • CBO: このタイプの最適化は、データ統計を活用して異なる実行計画のコストを推定し、実行において最も低いコストの計画を選択します。これにはアクセスパスやjoinアルゴリズムの選択が含まれます。

場合によっては、データベース管理者や開発者がクエリ最適化プロセスをより細かく制御する必要があります。これに基づいて、このドキュメントではCBOルールを管理するためのクエリヒントの使用方法を紹介します。

Note

現在、Dorisには優れたout-of-the-box機能があります。これは、ほとんどのシナリオにおいて、Dorisが様々なシナリオでパフォーマンスを適応的に最適化し、ユーザーがパフォーマンスチューニングのためにヒントを手動で制御する必要がないことを意味します。この章で紹介する内容は主に専門的なチューナー向けであり、業務担当者は簡単な理解のみで十分です。

CBOルール制御ヒントの基本構文は以下の通りです:

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

このヒントはSELECTキーワードの直後に記述され、括弧内で有効化するルール名を指定します(ルール名は大文字小文字を区別しません)。

現在、Dorisオプティマイザーはいくつかのコストベースの書き換えをサポートしており、USE_CBO_RULEヒントを使用して明示的に有効化できます。例えば:

  • PUSH_DOWN_AGG_THROUGH_JOIN
  • PUSH_DOWN_AGG_THROUGH_JOIN_ONE_SIDE
  • PUSH_DOWN_DISTINCT_THROUGH_JOIN

Case

以下はクエリの例です:

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
;

この例では、集約プッシュダウンのためのCBOルールが有効になっています。この操作により、結合操作の前にTableaを集約することができ、結合のコストを削減してクエリを高速化します。プッシュダウン後のプランは以下の通りです:

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]

概要

USE_CBO_RULEヒントを適切に使用することで、特定の高度なCBO最適化ルールを手動で有効にし、特定のシナリオでパフォーマンスを最適化できます。ただし、CBO最適化ルールの使用には、クエリ最適化プロセスとデータ特性の深い理解が必要です。ほとんどの場合、Dorisオプティマイザーの自動判定に依存することが依然として最良の選択です。

このページでは