全部产品

与联接顺序相关的 Hint

更新时间:2020-04-08 18:19:53

注意:关于本篇文档所有语法中引用的 queryblocktablespecindexspec 等元素的更多信息,请参阅文档 Hint 说明 中的 在 Hint 中定义查询块在 Hint 中定义查询块 小节。

LEADING Hint

LEADING Hint 指示优化器在执行计划中使用指定的表集作为前缀,它可以用来指定表的联接顺序。这个 Hint 比 ORDERED Hint 更通用。

以下是 LEADING Hint 的语法:

  1. /*+ LEADING ( [ @ queryblock ] tablespec [ tablespec ]... ) */

LEADING Hint 为确保按照用户指定的顺序联接表,所以会进行严格的检查。如果发现 Hint 指定的 table_name 不存在,则 LEADING Hint 失效。如果发现 Hint 中存在重复表,则 LEADING Hint 失效。如果在优化器联接期间,无法找到对应的表,那么该表及后面的表指定的联接顺序失效,该表前面指定的顺序依然有效。如果由于联接图中的依赖关系,无法首先按照指定的顺序联接指定的表,则 LEADING Hint 失效。如果指定两个或多个相互冲突的 LEADING Hint,则 LEADING Hint 失效。如果您指定了 ORDERED Hint,它将覆盖所有的 LEADING Hint。

示例如下:

  1. SELECT /*+ LEADING(e j) */ *
  2. FROM employees e, departments d, job_history j
  3. WHERE e.department_id = d.department_id
  4. AND e.hire_date = j.start_date;

ORDERED Hint

ORDERED Hint 指示数据库按照表在 FROM 子句中出现的顺序联接表。建议使用 LEADING Hint,它比 ORDERED Hint 更通用。

以下是 ORDERED Hint 的语法:

  1. /*+ ORDERED */

当您从需要联接的SQL语句中省略 ORDERED Hint 时,将由优化器将选择联接表的顺序。但是优化器不知道从每个表中要选择的行数,此时您可以使用 ORDERED Hint 来指定联接顺序。这样使您能够比优化器更好地选择内部表和外部表。如果在指定该 ORDERED Hint 后发生了改写,那么就按照改写后的语句中的 FROM 子句的顺序联接表。

示例如下:

  1. SELECT /*+ ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity
  2. FROM customers c, order_items l, orders o
  3. WHERE c.cust_last_name = 'Taylor'
  4. AND o.customer_id = c.customer_id
  5. AND o.order_id = l.order_id;