说明:
TDStore 列存功能在当前版本为实验特性,仅面向受邀用户开放。若您有需要可通过客户经理与我们联系并申请。
功能描述
使用 Join Order Hint 指定列存向量化引擎计划片段生成。在选择向量化引擎作为执行器时,在查询的 SQL 语句中添加 MySQL 风格的 Join Order Hint 即可传递给向量化引擎。目前支持三种 Join Order 相关的 Hint:
join_order
,join_prefix
,join_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=*)
t1
和t2
的 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=*)
t1
和t2
的 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.aJOIN t3 ON t2.a=t3.aJOIN t4 ON t3.a=t4.aJOIN 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;