关于 OceanBase SQL 执行计划中连接顺序提示(LEADING Hint)的使用,以下说法正确的是?
A. LEADING 提示用于强制指定多表连接时的连接顺序,但优化器有权忽略该提示如果它认为指定顺序不是最优的。
B. 使用 LEADING 提示时,必须同时使用 ORDERED 提示才能生效,否则优化器仍会进行重排序。
C. LEADING 提示中指定的表顺序决定了整个连接树的形状,优化器不会对指定顺序中的相邻表再进行内部重排(如交换 Build/Probe 端)。
D. 当查询涉及视图或子查询时,LEADING 提示无法作用于视图内部的表连接顺序,只能控制视图与外部表的连接顺序。
3 个赞
解析 :
LEADING 提示用于强制指定多表连接的外层顺序。一旦用户指定了连接顺序,优化器必须严格遵守该表序来构建连接树,不会对相邻两表的左右位置进行交换(即不会自动将小表作为 Build 端)。这是因为连接顺序已经隐含了表间的驱动关系,优化器在该顺序约束下选择具体的连接算法(如 Nested Loop、Hash Join)和构建端,但不会再翻转顺序。
-
A 错误 :
LEADING 是强提示 ,优化器不会忽略(除非存在语法错误或引用了不存在的表)。它与 ORDERED 不同,ORDERED 在特定版本中可能被弱化。
-
B 错误 :
LEADING 可以独立使用,不需要配合 ORDERED 。ORDERED 是更粗粒度的顺序控制(严格按 SQL 中表的出现顺序)。
-
C 正确 :优化器在
LEADING 指定的顺序内,不会交换相邻表的连接方向(Build/Probe 的选择仍可能调整,但不再是顺序交换,通常指不改变表的外层嵌套关系)。
-
D 错误 :
LEADING 提示可以影响视图内部 ,通过指定视图中定义的别名,或使用 LEADING(@subq t1 t2) 的查询块语法(Query Block)来深入到子查询或视图中指定表顺序。D 的说法过于绝对,部分版本中支持跨查询块指定。
C. LEADING 提示中指定的表顺序决定了整个连接树的形状,优化器不会对指定顺序中的相邻表再进行内部重排(如交换 Build/Probe 端)。