ヒントの概要
Database Hintsは、データベースクエリオプティマイザが特定のプランを生成する方法を導くために使用されるクエリ最適化技術です。Hintsを提供することで、ユーザーはより良いパフォーマンスの実現や特定の要件を満たすことを期待して、クエリオプティマイザのデフォルト動作を微調整できます。
現在、Dorisは優れたout-of-the-box機能を備えています。ほとんどのシナリオでは、Dorisはユーザーがビジネスチューニングのためにhintsを手動で制御する必要なく、様々な状況でパフォーマンスを適応的に最適化します。この章で紹介する内容は、主に専門的なチューニング担当者を対象としています。ビジネスユーザーは簡単に理解しておく程度で十分です。
Hint分類
Dorisは現在、leading hint、ordered hint、distribute hintを含む、いくつかのタイプのhintsをサポートしています:
- Leading Hint:leading hintで提供される順序に従ってjoin順序を指定します。
- Ordered Hint:元のテキストシーケンスとしてjoin順序を指定するleading hintの特定のタイプです。
- Distribute Hint:joinのデータ配布方法をshuffleまたはbroadcastのいずれかとして指定します。
Hint例
大量のデータを持つテーブルを想像してください。特定のケースでは、テーブルのjoin順序がクエリパフォーマンスに影響することがあることを知っているかもしれません。このような状況では、Leading Hintを使用して、オプティマイザに従わせたいテーブルjoin順序を指定できます。
以下のSQLクエリを例に取ります。実行効率が理想的でない場合、元のSQLを変更せずにjoin順序を調整して、ユーザーの元のシナリオに影響を与えることなくチューニング目標を達成したいと思うかもしれません。
mysql> explain shape plan select * from t1 join t2 on t1.c1 = c2;
+-------------------------------------------+
| Explain String |
+-------------------------------------------+
| PhysicalResultSink |
| --PhysicalDistribute |
| ----PhysicalProject |
| ------hashJoin[INNER_JOIN](t1.c1 = t2.c2) |
| --------PhysicalOlapScan[t2] |
| --------PhysicalDistribute |
| ----------PhysicalOlapScan[t1] |
+-------------------------------------------+
この場合、Leading Hintを使用してt1とt2の結合順序を任意に変更できます。例えば:
mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on t1.c1 = c2;
+-----------------------------------------------------------------------------------------------------+
| Explain String(Nereids Planner) |
+-----------------------------------------------------------------------------------------------------+
| PhysicalResultSink |
| --PhysicalDistribute |
| ----PhysicalProject |
| ------hashJoin[INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=() build RFs:RF0 c1->[c2] |
| --------PhysicalOlapScan[t2] apply RFs: RF0 |
| --------PhysicalDistribute |
| ----------PhysicalOlapScan[t1] |
| |
| Hint log: |
| Used: leading(t2 t1) |
| UnUsed: |
| SyntaxError: |
+-----------------------------------------------------------------------------------------------------+
この例では、Leading Hint /*+ leading(t2 t1) */が使用されています。Leading Hintは、指定されたテーブル(t2)を駆動テーブルとして使用し、実行プランで(t1)の前に配置するようにオプティマイザーに指示します。
Hint Log
Hint Logは主にEXPLAINの実行時にヒントが有効かどうかを表示するために使用されます。通常、EXPLAIN出力の下部に配置されます。
Hint Logには3つのステータスがあります:
+---------------------------------+
| Hint log: |
| Used: |
| UnUsed: |
| SyntaxError: |
+---------------------------------+
Used:ヒントが有効であることを示します。UnUsedとSyntaxError:どちらもヒントが有効でないことを示します。SyntaxErrorは、ヒントの使用において構文エラーがある、または構文がサポートされていないことを示し、サポートされていない理由に関する追加情報が提供されます。
ユーザーは、Hintログを通じて有効性と無効である理由を確認でき、調整と検証を容易にします。
まとめ
Hintは実行プランを手動で管理するための強力なツールです。現在、Dorisはleading hint、ordered hint、distribute hintなどをサポートしており、ユーザーが結合順序、shuffleメソッド、その他の可変設定を手動で管理できるようにし、より便利で効果的な操作機能をユーザーに提供します。