Oracle Hints 优化器指南
Oracle Hints 是 Oracle 数据库中的一种特殊指令,用于向查询优化器提供指导,影响其执行计划的选择。它们被嵌入在 SQL 语句的注释中,但会被 Oracle 优化器识别和执行。
基本概念
- 什么是 Hints:Hints 是以特定格式出现在 SQL 语句注释中的指令,格式为
/*+ hint_name */或--+ hint_name - 作用:覆盖优化器默认选择的执行计划,解决性能问题
- 使用场景:当统计信息不准确、优化器选择次优计划或需要特定访问路径时
常用 Hints 分类
1. 访问路径 Hints
FULL(table):强制全表扫描INDEX(table index):强制使用特定索引INDEX_FFS(table index):快速全索引扫描NO_INDEX(table index):避免使用特定索引
2. 连接顺序 Hints
ORDERED:强制按 FROM 子句中表的顺序连接LEADING(table):指定连接顺序中的主导表
3. 连接方法 Hints
USE_NL(table):强制嵌套循环连接USE_HASH(table):强制哈希连接USE_MERGE(table):强制排序合并连接
4. 并行处理 Hints
PARALLEL(table degree):指定并行度NO_PARALLEL(table):禁用并行处理
5. 查询转换 Hints
NO_REWRITE:防止查询重写REWRITE(view):强制使用物化视图重写
使用示例
-- 强制使用索引
SELECT /*+ INDEX(emp emp_idx) */ * FROM emp WHERE deptno = 10;
-- 强制嵌套循环连接
SELECT /*+ ORDERED USE_NL(dept) */ emp.ename, dept.dname
FROM emp, dept
WHERE emp.deptno = dept.deptno;
-- 指定并行度
SELECT /*+ PARALLEL(emp 4) */ * FROM emp WHERE sal > 2000;
最佳实践
- 谨慎使用:Hints 应作为最后手段,优先考虑更新统计信息或重构 SQL
- 测试验证:在生产环境使用前,务必测试 Hint 的效果
- 文档记录:对使用的 Hints 做好文档记录,说明原因
- 版本兼容:注意不同 Oracle 版本中 Hints 的行为可能变化
- 避免过度使用:过多 Hints 会使 SQL 难以维护且可能适得其反
注意事项
- Hints 只是建议,某些情况下优化器可能忽略它们
- 错误的 Hints 可能导致性能下降
- 随着数据变化,原本有效的 Hints 可能不再适用
- 使用
/*+ */格式比--+更可靠,后者可能被某些客户端截断
通过合理使用 Hints,可以在特定场景下显著提升查询性能,但需要深入理解其工作原理和潜在影响。

1422

被折叠的 条评论
为什么被折叠?



