OceanBase 与访问路径相关的 Hint
INDEX Hint
INDEX Hint 指示优化器对指定的表使用索引扫描。您可以将 INDEX Hint
用于基于函数、域、B - 树、位图和位图连接的索引。
以下是INDEX Hint
的语法:
/*+ INDEX ( [ @ queryblock ] tablespec [ indexspec [ indexspec ]... ] ) */
Hint 的行为取决于indexspec
规范:
- 如果 INDEX Hint 指定了一个单个可用索引,则数据库将对该索引执行扫描。优化器不考虑全表扫描或表上另一个索引的扫描。
- 如果
INDEX
Hint 指定了可用索引的列表,那么优化器将考虑扫描列表中每个索引的成本,然后以最低的成本执行索引扫描。如果数据库从这个列表中扫描多个索引并合的访问路径成本最低,数据库将选用这种扫描方案。数据库不考虑对没有在列表中的索引进行全表扫描或扫描。 - 如果
INDEX
Hint 没有指定具体的索引,那么优化器将考虑表上每个可用索引的扫描成本,然后以最低的成本执行索引扫描。如果数据库扫描多个索引并合的访问路径成本最低,数据库将选用这种扫描方案。优化器不考虑全表扫描。
示例如下:
SELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id
FROM employees
WHERE department_id > 50;
FULL Hint
FULL
Hint 指示优化器对指定的表执行全表扫描。
以下是 FULL
Hint 的语法:
/*+ FULL ( [ @ queryblock ] tablespec ) */
示例如下:
SELECT /*+ FULL(e) */ employee_id, last_name
FROM hr.employees e
WHERE last_name LIKE :b1;
数据库对表 employees 执行一次完整的表扫描来执行这条语句,即使有一个由 WHERE
子句中的条件提供的索引在列 last_name 上。
在 FROM
子句中,表 employees 有个别名 e,因此 Hint 必须根据表的别名而不是名称来引用该表。即使在 FROM
子句中指定了 Schema 名,也不要在 Hint 中引用它们。