#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 |