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;