美河学习在线 www.eimhe.com
实战 Oracle 优化器 Hint
虽然基于成本的优化器在选择正确的优化路径方面和为系统中成千上万的查询利用索
引的方面极其精确,可它也并非尽善尽美。为此,Oracle 可以为制定查询提供具体的提示:
否决优化器的决定,以期获得更佳的查询性能。这也是 Oracle 为什么引入 Hint。
Hint 是 Oracle 数据库中很有特色的一个功能,是很多 DBA 优化中经常采用的一个手段。
那为什么 Oracle 会考虑引入优化器呢?基于代价的优化器是很聪明的,在绝大多数情况下
它会选择正确的优化器,减轻 DBA 的负担。但有时它也聪明反被聪明误,选择了很差的执
行计划,使某个语句的执行变得奇慢无比。此时就需要 DBA 进行人为的干预,告诉优化器
使用指定的存取路径或连接类型生成执行计划,从而使语句高效地运行。Hint 就是 Oracle
提供的一种机制,用来告诉优化器按照告诉它的方式生成执行计划。
当遇到 SQL 执行计划不好的情况,应优先考虑统计信息等问题,而不是直接加 Hint 了
事。如果统计信息无误,应该考虑物理结构是否合理,即没有合适的索引。只有在最后仍然
不能 SQL 按优化的执行计划执行时,才考虑 Hint。毕竟使用 Hint,需要应用系统修改代码,
Hint 只能解决一条 SQL 的问题,并且由于数据分布的变化或其他原因(如索引更名)等,会导
致 SQL 再次出现性能问题。
Hint 是比较"暴力"的一种解决方式,不是很优雅。需要开发人员手工修改代码。Hint 不
会去适应新的变化。比如数据结构、数据规模发生了重大变化,但使用 Hint 的语句是感知
变化并产生更优的执行计划。Hint 随着数据库版本的变化,可能会有一些差异、甚至废弃的
情况。此时,语句本身是无感知的,必须人工测试并修正。
提示是 Oracle 为了不破坏和其他数据库引擎之间对 SQL 语句的兼容性而提供的一种扩
展功能。Oracle 决定把提示作为一种特殊的注释来添加。它的特殊性表现在提示必须紧跟着
DELETE、INSERT、UPDATE 或 MERGE 关键字。换句话说,提示不能像普通注释那样在 SQL 语
句中随处添加。且在注释分隔符之后的第一个字符必须是加号。在后面的用法部分,会详细
说明。
Hint 提供的功能非常丰富,可以很灵活地调整语句的执行过程。通过 Hint,我们可以调
整:优化器类型,优化器优化目标,数据读取方式(访问路径),查询转换类型,表间关联的
顺序,表间关联的类型,并行特性,其他特性
这节课主要介绍 Hint 的基本语法和使用方法。
1
和优化器相关的
当对优化器为某个语句所制定的基本执行计划不满意时,最好的办法就是通过提示来转
换优化器的模式,并观察其转换后的结果,看是否已经达到期望程度。如果只通过转换优化
器的模式就可以获得非常好的执行计划,则就没有必要额外使用更为复杂的提示了。
ALL_ROWS
为实现查询语句整体最优化而引导优化器制定最少成本的执行计划。这个提示会使优化
器选择一条可最快检索所有查询行的路径,而代价就是在检索一行数据时,速度很慢。
FIRST_ROWS
为获得最佳响应时间而引导优化器制定最少成本的执行计划。这个提示会使优化器选择