简单了解 Oracle Hint

《基于Oracle的SQL优化》—— Oracle Hint

Oracle的优化器非常智能,在绝大多数情况下,都会选择正确的执行计划,减轻DBA的负担。但是,有时候也会选择了效用低的执行计划,使目标SQL成本消耗过高。此时,就需要DBA人为干预,手动纠正对于执行计划的错误选择。而Hint作为Oracle数据库里SQL优化的一种机制,通常就是用于调整指定目标SQL的执行计划,告诉优化器如何生成执行计划,使得语句高效执行。

 

一、怎样理解Hint

1.Hint可以影响优化器对于执行计划的选择,但这种影响不是强制性的。优化器在某些情况下,可能会忽略目标SQL的Hint,即使这个Hint在语法和语义上都是有效的。

2.当遇到SQL执行计划不好的情况时,不用盲目地使用Hint,应该先尝试常规调整手段,比如重新收集统计信息。在这些问题都考虑之后,执行计划仍然没有改善,此时可以考虑使用Hint。

3.使用Hint只能解决当前SQL的执行计划问题,当目标的数据分布等发生变化时,Hint无法智能地的同步更新,会导致SQL无法达到预期效果。

4.如果在目标SQL中使用了Hint,就意味着自动启用CBO。此处,有两个例外:RULE、DRIVING_SITE,他们可以在RBO下使用,不会自动启用CBO。

 

二、Hint的运行逻辑

我们都知道,优化器在解析目标SQL时,会从目标SQL的各种可能的、不同的执行路径中,选择一条作为该SQL的执行计划。不同类型的优化器,其选择执行计划时判断的标准是不一样的。比如,对于CBO而言,它的判断标准就是各个执行路径的成本,它会选择一条成本值最小的路径来最为目标SQL的执行计划。 

当目标SQL中出现了Hint,那么优化器对于执行计划的选择就会受到影响。在其原有的选择标准上,将Hint的建议也会一并考虑进来。如果Hint的建议可用,则选择该执行计划;反之,采用原有标准选定的执行计划。

我们可以这样理解:比如优化器在解析目标SQL时发现该SQL可能的执行路径有3条,分别是A、B、C三个路径。如果目标SQL中有使用Hint明确指出选择路径A,则优化器就会选择路径A作为其执行计划;但是优化器在解析目标SQL时,发现只有B、C两条可能的执行路径,此时指定A路径的Hint对于优化器而言就是失效的,在原有判断标准上选择出B、C两条路径中的最优执行计划。

需要注意的是,Oracle数据库中并不是所有的Hint都是针对优化器的。

 

三、Hint的用法

Hint实际上就是Oracle数据库中一种特殊的注释,需要用特定的写法和用法。

Hint的写法示例:

/*+ gather_plan_statistics */
/*+ INDEX(TABLE_NAME INDEX_NAME) */ 
  •  /* */ :表示注释;
  • + :表示Hint,且 + 必须紧跟在 * 后面,不可有空格;
  • 如果有包含多个Hint,则每个之间至少用一个空格分隔开;
  • Hint的注释必须跟在SELECT、DELETE、INSERT、UPDATE、MERGE关键字之后,否则Hint无效;
  • TABLE_NAME是必写项,若目标SQL中该表有别名,Hint中需要使用别名;
  • 如果不指定Hint生效的查询块(Query Block),则Hint的生效范围仅限于本身所在的查询块。

你可能感兴趣的:(Oracle之性能优化,oracle,数据库)