Hint

Hint是Oracle提供的一种sql语法,它允许用户在sql中插入相关的语法来影响sql的执行方式。如果CBO(基于成本的优化器)认为使用Hint会导致错误的结果,Hint将被忽略

1. 访问路径相关的Hint:

FULL Hint: 告诉优化器对指定的表通过全表扫描的方式访问数据

  • select /*+ full(t) */ * from t;
  • select /*+ full(a) */ * from t a;

INDEX Hint: 告诉优化器对指定的表通过索引的方式访问数据,当访问索引会导致结果集不完整时,优化器将忽略这个Hint

select /*+ index(t t_ind) */ * from t where id>1;

NO_INDEX Hint:  告诉优化器对指定的表不允许使用索引的方式访问数据

select /*+ no_index(t t_ind) */ * from t where id>1;

INDEX_DESC Hint: 告诉优化器对指定的索引通过降序的方式访问数据,当访问索引会导致结果集不完整时,优化器将忽略这个Hint

select /*+ index_desc(t t_ind) */ * from t where id=1;

INDEX_COMBINE Hint: 告诉优化器强制使用位图索引,当访问索引会导致结果集不完整时,优化器将忽略这个Hint

select /*+ index_combine(t t_ind) */ * from t;

INDEX_FFS Hint: 告诉优化器以INDEX_FFS(INDEX Fast Full Scan)的方式访问数据,当访问索引会导致结果集不完整时,优化器将忽略这个Hint

select /*+ index_ffs(t t_ind) */ * from t where id<10;

INDEX_JOIN: 索引关联,当谓词中引用的列都有索引的时候,可以通过索引关联的方式来访问数据

select /*+ index_join(t t_ind t_bm) */ id from t where id>100 and name='hello';

2. 表关联顺序的Hint:

LEADIND Hint: 在一个多表关联的查询中,这个hint指定由哪个表作为驱动表(优化器优先访问哪个表上的数据)

select /*+ leading(t1, t) */ t.* from t, t1 where t1.id=t.id;

3. 表关联操作的Hint:

USE_HASH, USE_NL, USE_MERGE Hint: 这三种关联方式是多表关联中主要的关联方式。通常来讲,当两个表都比较大时,hash join的效率要高于nested loops(嵌套循环)。

hash join是将一个表(小一点那个表)做hash运算,将列数据存储到hash列表中,从另一个表抽取记录做hash运算,到hash列表中找到相应的值做匹配。

nested loop是从一个表中读取数据,访问另一张表(通常是索引)来做匹配,适用于一个关联表比较小的时候,效率更高。

merge join首先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据到另一个排序表中做匹配,它需要做更多的排序,所以消耗资源更多,通常来说,能够使用merge join的地方,hash join都可以发挥更好性能。

NO_USE_HASH, NO_USE_NL, NO_USE_MERGE Hint

4. 并行执行相关的Hint:

 PARALLEL Hint:指定sql执行的并行度,这个值将覆盖表自身设定的并行度,如果这个值为default,CBO将使用系统参数值

select /*+ parallel(t 4) */ count(*) from t;

NO_PARALLEL Hint

5.其他方面的Hint

DYNAMIC_SAMPLING Hint: 提示sql执行时动态采样的级别。从0-10,它将覆盖系统默认的动态采样级别

select /*+ dynamic_sampling(t 4) */ * from t where id>1;

 

 

 

posted on 2014-05-17 13:53  当时已枉然  阅读(622)  评论(0编辑  收藏  举报