#Hint

Hint是一种特殊的注释,它以固定的格式和位置出现在SQL语句的文本中,用于影响优化器对于执行计划的选择。但这种影响不是强制的,优化器在某些情况下可能忽略SQL的HINT指令。

# 改变Join连接顺序的Hint

LEADING语法能够改变Join两边表的顺序,常见做法是通过LEADING调整大小表,减少扫描数量;或通过LEADING调整表连接顺序,增加选择率,减少执行负担。

LEADING有一定的限制,例如只能调整具体表的顺序,而不能调整表与表连接后产生的结果集与其他结果集之间的顺序。

# 改变Join类型的Hint

USE_和NO_USE_语法能够指定两张表的连接类型:

模式 说明 备注
USE_NL 优先选择Nesed Loop Join 任何Join类型一定能转成Nested Loop Join
NO_USE_NL 优先选择非Nesed Loop Join类型 无法生成其他Join类型时,不生效
USE_HASH 优先使用Hash Join 无法使用Hash Join时,不生效
NO_USE_HASH 不使用 Hash Join 根据代价评估使用Nested Loop Join或Merge Join
USE_MERGE 优先使用Merge Join 无法生成Merge Join时,不生效
NO_USE_MERGE 不使用Merge Join 根据评估使用Nested Loop Join或Hash Join

# 改变访问路径的Hint

Hint指令也可以改变访问路径,例如强制根据索引扫描或强制采用全表扫描。

模式 说明 备注
INDEX 优先使用Hint指定的索引 一定会生效,选Fast Full Scan和Index Scan之间Cost最小的一个
NO_INDEX 不使用Hint指定的索引 一定会生效,选择Table Full Scan
INDEX_FFS 优先使用Fast Full Scan 一定会生效,只选Fast Full Scan
NO_INDEX_FFS 不使用Fast Full Scan 一定会生效,可选Index Range Scan等
FULL 使用全表扫描 一定会生效,选择Table Full Scan