Oracle Hint入门

优化器

Oracle数据库中的优化器又叫查询优化器(Query Optimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。Oracle的优化器原来有两种,基于规则的优化器(RBO : Rule-Based Optimization)与基于代价的优化器(CBO : Cost-Based Optimization)。ORACLE已经舍弃了RBO,选择CBO。CBO是一种比RBO更加合理、可靠的优化器。CBO是计算各种可能的“执行计划”的“代价”,即COST,然后从中选用COST最低的一个作为真正的执行计划使用。而这个过程取决于数据库对象的统计信息。因此,统计信息的准确性会影响CBO的选择。


Hints

当然,在绝大多数情况下它会选择正确的优化器。减轻了DBA的很多负担。但是有时候它也会选择一些差的执行计划,导致SQL 性能很差。
Oracle Hints是一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划。


Hints 作用

1. 使用的优化器的类型  
2. 基于代价的优化器的优化目标,是all_rows还是first_rows。  
3. 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。  
4. 表之间的连接类型  
5. 表之间的连接顺序  
6. 语句的并行程度 


使用Hints

首先,Hints只应用在它们所在sql语句块(statement block,由select、update、delete关键字标识)上。

语法:

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */ 
或者
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...

注意:如果语(句)法不对,则ORACLE会自动忽略所写的HINT,不报错。自动忽略!

常见用法

1. /*+ALL_ROWS*/  
作用:表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.  
例:

SELECT /*+ALL_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';


2. /*+FIRST_ROWS*/  
作用:表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.  
例:

SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';

3. /*+FULL(TABLE)*/  
作用:表明对表选择全局扫描的方法.  
例:

SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';

4. /*+INDEX(TABLE INDEX_NAME)*/  
作用:表明对表选择索引的扫描方法.  
例:

SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M'; 


5. /*+ORDERED*/  
作用:根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接.  
例:

SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;


总结

Hints 的使用,可以让我们在不改变数据库的情况下,对SQL进行一些优化操作。提供了很大的方便。不过,不建议在代码中使用hint,在代码使用hint使得CBO无法根据实际的数据状态选择正确的执行计划。毕竟在生产环境中,数据库是变化的。如果我们的DB 设计的合理,让Oracle 自己决定采用什么执行计划已经可以满足我们的需要。










猜你喜欢

转载自blog.csdn.net/hustzw07/article/details/78678611