クエリヒント
クエリヒントは、クエリオプティマイザに対してクエリの実行方法を明示的に指示するための指示またはコメントです。現在、StarRocks は3種類のヒントをサポートしています: システム変数ヒント (SET_VAR
)、ユーザー定義変数ヒント (SET_USER_VARIABLE
)、および Join ヒントです。ヒントは単一のクエリ内でのみ効果 を発揮します。
システム変数ヒント
SET_VAR
ヒントを使用して、SELECT および SUBMIT TASK 文で1つ以上のシステム変数を設定し、その後に文を実行できます。また、CREATE MATERIALIZED VIEW AS SELECT や CREATE VIEW AS SELECT などの他の文に含まれる SELECT 句でも SET_VAR
ヒントを使用できます。ただし、CTE の SELECT 句で SET_VAR
ヒントを使用した場合、文が正常に実行されても SET_VAR
ヒントは効果を発揮しません。
システム変数の一般的な使用法と比較して、SET_VAR
ヒントはステートメントレベルで効果を発揮し、セッション全体には影響を与えません。
構文
[...] SELECT /*+ SET_VAR(key=value [, key = value]) */ ...
SUBMIT [/*+ SET_VAR(key=value [, key = value]) */] TASK ...
例
集計クエリの集計モードを指定するには、SET_VAR
ヒントを使用して、集計クエリ内のシステ ム変数 streaming_preaggregation_mode
と new_planner_agg_stage
を設定します。
SELECT /*+ SET_VAR (streaming_preaggregation_mode = 'force_streaming',new_planner_agg_stage = '2') */ SUM(sales_amount) AS total_sales_amount FROM sales_orders;
SUBMIT TASK 文の実行タイムア ウトを指定するには、SET_VAR
ヒントを使用して、SUBMIT TASK 文内のシステム変数 insert_timeout
を設定します。
SUBMIT /*+ SET_VAR(insert_timeout=3) */ TASK AS CREATE TABLE temp AS SELECT count(*) AS cnt FROM tbl1;
マテリアライズドビューを作成する際のサブクエリ実行タイムアウトを指定するには、SET_VAR
ヒントを使用して、SELECT 句内のシステム変数 query_timeout
を設定します。
CREATE MATERIALIZED VIEW mv
PARTITION BY dt
DISTRIBUTED BY HASH(`key`)
BUCKETS 10
REFRESH ASYNC
AS SELECT /*+ SET_VAR(query_timeout=500) */ * from dual;
ユーザー定義変数ヒント
SET_USER_VARIABLE
ヒントを使用して、SELECT 文または INSERT 文で1つ以上のユーザー定義変数を設定できます。他の文に SELECT 句が含まれている場合、その SELECT 句でも SET_USER_VARIABLE
ヒントを使用できます。他の文は SELECT 文および INSERT 文であることができますが、CREATE MATERIALIZED VIEW AS SELECT 文および CREATE VIEW AS SELECT 文では使用できません。CTE の SELECT 句で SET_USER_VARIABLE
ヒントを使用した場合、文が正常に実行されても SET_USER_VARIABLE
ヒントは効果を発揮しません。v3.2.4 以降、StarRocks はユーザー定義変数ヒントをサポートしています。
ユーザー定義変数の一般的な使用法と比較して、SET_USER_VARIABLE
ヒントはステートメントレベルで効果を発揮し、セッション全体には影響を与えません。
構文
[...] SELECT /*+ SET_USER_VARIABLE(@var_name = expr [, @var_name = expr]) */ ...
INSERT /*+ SET_USER_VARIABLE(@var_name = expr [, @var_name = expr]) */ ...
例
次の SELECT 文はスカラーサブクエリ select max(age) from users
と select min(name) from users
を参照しているため、SET_USER_VARIABLE
ヒントを使用してこれら2つのスカラーサブクエリをユーザー定義変数として設定し、その後クエリを実行できます。
SELECT /*+ SET_USER_VARIABLE (@a = (select max(age) from users), @b = (select min(name) from users)) */ * FROM sales_orders where sales_orders.age = @a and sales_orders.name = @b;
Join ヒント
複数テーブルの Join クエリでは、オプティマイザは通常、最適な Join 実行方法を選択します。特別な場合には、Join ヒントを使用してオプティマイザに Join 実行方法を明示的に指示したり、Join Reorder を無効にすることができます。現在、Join ヒントは Shuffle Join、Broadcast Join、Bucket Shuffle Join、または Colocate Join を Join 実行方法として提案することをサポートしています。Join ヒントが使用されると、オプティマイザは Join Reorder を行いません。そのため、より小さいテーブルを右テーブルとして選択する必要があります。さらに、Colocate Join または Bucket Shuffle Join を Join 実行方法として提案する場合、結合されるテーブルのデータ分布がこれらの Join 実行方法の要件を満たしていることを確認してください。そうでない場合、提案された Join 実行方法は効果を発揮しません。