列存向量化引擎 Join Order Hint

最近更新时间:2025-06-13 20:31:03

我的收藏
说明:
TDStore 列存功能在当前版本为实验特性,仅面向受邀用户开放。若您有需要可通过客户经理与我们联系并申请。

功能描述

使用 Join Order Hint 指定列存向量化引擎计划片段生成。在选择向量化引擎作为执行器时,在查询的 SQL 语句中添加 MySQL 风格的 Join Order Hint 即可传递给向量化引擎。目前支持三种 Join Order 相关的 Hint:join_orderjoin_prefixjoin_suffix
类型
作用范围
位置约束
适用场景
join_order
全表 join 顺序片段
计划树中间位置
明确多表关联路径
join_prefix
前缀表强制左深树顺序
计划树最左端
优先处理维度表
join_suffix
后缀表强制右深树顺序
计划树最右端
延迟处理大表关联

join_order

join_order Hint 类型尝试将 Hint 内指定的几个表 join 顺序固定为一个左深树顺序片段。未指定的表根据默认优化器逻辑和这个片段连接。
示例1
SELECT /*+join_order(t2,t1)*/ * FROM t1 JOIN t2 ON t1.a=t2.a;
执行计划解析​:
| physical_plan
-> Projection: a a (rows=*)
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t1 Projections: a (rows=*)
-> Tdstore Scan Text: test.t2 Projections: a (rows=*)
全部表的 join 顺序被指定。Hash Join 情况下,t2是 build side,t1是 probe side,这和 MySQL 计划一致。
示例2
SELECT /*+join_order(t2,t1)*/ * FROM t1 JOIN t2 ON t1.a=t2.a JOIN t3 ON t2.a=t3.a;
执行计划解析​:
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t1 Projections: a (rows=*)
-> Tdstore Scan Text: test.t2 Projections: a (rows=*)
上面的计划被作为一个计划片段,t3表在计划中所处的位置不确定,由优化器决定。

join_prefix

除了具有 join_order 的作用,同时被指定计划片段会出现在整个计划树的最左侧(显示的计划的底部)。
语法示例
SELECT /*+join_prefix(t2,t1)*/ * FROM t1 JOIN t2 ON t1.a=t2.a JOIN t3 ON t2.a=t3.a;
执行计划解析​:
| physical_plan
-> Projection: a a a (rows=*)
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t3 Projections: a (rows=*)
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t1 Projections: a (rows=*)
-> Tdstore Scan Text: test.t2 Projections: a (rows=*)
t1t2的 join 顺序被指定,同时被固定在计划最左侧。

join_suffix

除了具有 join_order 的作用,同时被指定计划片段会出现在整个计划树的最右侧(显示的计划的顶部)。
语法示例
SELECT /*+join_suffix(t2,t1)*/ * FROM t1 JOIN t2 ON t1.a=t2.a JOIN t3 ON t2.a=t3.a;
执行计划解析​:
| physical_plan
-> Projection: a a a (rows=*)
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t1 Projections: a (rows=*)
-> Inner Hash Join (a = a) (rows=*)
-> Tdstore Scan Text: test.t2 Projections: a (rows=*)
-> Tdstore Scan Text: test.t3 Projections: a (rows=*)
t1t2的 join 顺序被指定,同时被固定在计划最右侧。

注意事项

Hint 中的表的大小写不区分,且只能指定表名,而非 query block 的名字。
在同一个 Hint 中可以有1个或多个表,其中对 join_order 当指定超过2个表时有效。可以同时有多个 Hint。比如下面的所有 Hint 均生效:
SELECT /*+join_prefix(t2,t1) join_order(t3,t5,t4)*/ * FROM t1 JOIN t2 ON t1.a=t2.a
JOIN t3 ON t2.a=t3.a
JOIN t4 ON t3.a=t4.a
JOIN t5 ON t4.a=t5.a;
每个 SQL 查询中至多允许一个 join_prefix ​或一个 join_suffix Hint。若存在多个同类型 Hint,仅第一个生效,剩下的会被忽略。
当 Hint 之间有冲突时,后指定的 Hint 会被忽略。比如下面第二个 Hint 不会生效:
SELECT /*+join_order(t2,t1) join_order(t1,t2)*/ * FROM t1 JOIN t2 ON t1.a=t2.a;
如果两表之间没有 join 条件,这两个表若在 Join Order Hint 中毗邻,则该 Hint 会被忽略。比如下面的 Hint 无效:
SELECT /*+join_order(t2,t1)*/ * FROM t1,t2;