云数据库OceanBase入门教程 OceanBase 与联接顺序相关的 Hint

2024-02-26 开发教程 云数据库OceanBase入门教程 匿名 6

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​ 子句的顺序联接表。