ヒントでCBOルールを制御する
概要
クエリオプティマイザーは、実行プランを生成する際に一連のルールを適用します。これらのルールは主に2つのタイプに分類されます:ルールベースオプティマイザー(RBO)とコストベースオプティマイザー(CBO)です。
- RBO:このタイプの最適化は、特定のデータ統計を考慮することなく、事前定義されたヒューリスティックルールのセットを適用してクエリプランを改善します。predicate pushdownやprojection pushdownなどの戦略がこのカテゴリに含まれます。
- CBO:このタイプの最適化は、データ統計を活用して異なる実行プランのコストを推定し、実行のために最もコストの低いプランを選択します。これには、アクセスパスとjoinアルゴリズムの選択が含まれます。
場合によっては、データベース管理者や開発者がクエリ最適化プロセスをより詳細に制御する必要がある場合があります。これに基づき、この文書ではクエリヒントを使用してCBOルールを管理する方法を紹介します。
現在、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ルールが有効になっています。この操作により、join操作の前にテーブルaを集約することができ、joinのコストを削減してクエリを高速化します。プッシュダウン後のプランは以下の通りです:
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オプティマイザーの自動判定に依存することが依然として最良の選択です。