OceanBase 与联接顺序相关的 Hint
LEADING Hint
LEADING
Hint 指示优化器在执行计划中使用指定的表集作为前缀,它可以用来指定表的联接顺序。这个 Hint 比 ORDERED
Hint 更通用。
以下是 LEADING Hint
的语法:
/*+ LEADING ( [ @ queryblock ] tablespec [ tablespec ]... ) */
LEADING
Hint 为确保按照用户指定的顺序联接表,所以会进行严格的检查。如果发现 Hint 指定的 table_name
不存在,则 LEADING
Hint 失效。如果发现 Hint 中存在重复表,则 LEADING
Hint 失效。如果在优化器联接期间,无法找到对应的表,那么该表及后面的表指定的联接顺序失效,该表前面指定的顺序依然有效。如果由于联接图中的依赖关系,无法首先按照指定的顺序联接指定的表,则 LEADIN
G Hint 失效。如果指定两个或多个相互冲突的 LEADING
Hint,则 LEADING Hint 失效。如果您指定了 ORDERED
Hint,它将覆盖所有的 LEADING
Hint。
示例如下:
SELECT /*+ LEADING(e j) */ *
FROM employees e, departments d, job_history j
WHERE e.department_id = d.department_id
AND e.hire_date = j.start_date;
ORDERED Hint
ORDERED
Hint 指示数据库按照表在 FROM
子句中出现的顺序联接表。建议使用 LEADING
Hint,它比 ORDERED
Hint 更通用。
以下是 ORDERED
Hint 的语法:
/*+ ORDERED */
当您从需要联接的SQL语句中省略 ORDERED
Hint 时,将由优化器将选择联接表的顺序。但是优化器不知道从每个表中要选择的行数,此时您可以使用 ORDERED
Hint 来指定联接顺序。这样使您能够比优化器更好地选择内部表和外部表。如果在指定该 ORDERED
Hint 后发生了改写,那么就按照改写后的语句中的 FROM
子句的顺序联接表。