USE_HASH(table)
作用:将指定表保存在内存hash表,快速的与其他表连接在一起。
注意:要使用USE_HASH,必须保证HASH_AREA_SIZE和PGA_AGGREGATE_TARGET足够大。
例子:
SQL>select /*+use_hash(a)*/ a.f1_num2, b.f3_numnull from t_wei a, t_huang b where a.f1_num2=b.f1_num and a.f1_num2 < 1000 and b.f3_numnull < 10000;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=13 Card=300 Bytes=11
700)
1 0 HASH JOIN (Cost=13 Card=300 Bytes=11700)
2 1 INDEX (RANGE SCAN) OF 'PK_T_WEI' (UNIQUE) (Cost=2 Card=2
66 Bytes=3458)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_HUANG' (Cost=10 Card
=1323 Bytes=34398)
4 3 INDEX (RANGE SCAN) OF 'PK_T_HUANG' (UNIQUE) (Cost=2 Ca
rd=1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
81 consistent gets
0 physical reads
0 redo size
13072 bytes sent via SQL*Net to client
1018 bytes received via SQL*Net from client
35 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
496 rows processed
对比:
SQL>select a.f1_num2, b.f3_numnull from t_wei a, t_huang b where a.f1_num2=b.f1_num and a.f1_num2 < 1000 and b.f3_numnull < 10000;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 INDEX (RANGE SCAN) OF 'PK_T_WEI' (UNIQUE)
3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_HUANG'
4 3 INDEX (UNIQUE SCAN) OF 'PK_T_HUANG' (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3069 consistent gets
0 physical reads
0 redo size
13072 bytes sent via SQL*Net to client
1018 bytes received via SQL*Net from client
35 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
496 rows processed
PUSH_SUBQ
作用:可以尽可能早的评估子查询。当子查询返回比较少行时,这个提示比较有用。
注意:当查询使用合并连接和远程表连接时,这个提示无效。
例子:
SQL>select /*+push_subq*/ * from t_huang where f2_char < ‘1000’ and f1_num in (select f1_num2 from t_wei where f2_char2 < ‘1’);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=21 Card=1331 Bytes=1
17128)
1 0 HASH JOIN (Cost=21 Card=1331 Bytes=117128)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_WEI' (Cost=10 Card=2
66 Bytes=6650)
3 2 INDEX (RANGE SCAN) OF 'IX_WEI_F234_CHAR' (NON-UNIQUE)
(Cost=2 Card=1)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_HUANG' (Cost=10 Card
=26464 Bytes=1667232)
5 4 INDEX (RANGE SCAN) OF 'IX_HUANG_F23_CHAR' (NON-UNIQUE) (Cost=2 Card=4764)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
508038 consistent gets
33 physical reads
2044 redo size
136343 bytes sent via SQL*Net to client
2470 bytes received via SQL*Net from client
167 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2482 rows processed
对比:
SQL>select * from t_huang where f2_char < ‘1000’ and f1_num in (select f1_num2 from t_wei where f2_char2 < ‘1’);
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_HUANG'
3 2 INDEX (RANGE SCAN) OF 'IX_HUANG_F23_CHAR' (NON-UNIQUE)
4 1 TABLE ACCESS (BY INDEX ROWID) OF 'T_WEI'
5 4 INDEX (UNIQUE SCAN) OF 'PK_T_WEI' (UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1008640 consistent gets
0 physical reads
0 redo size
136343 bytes sent via SQL*Net to client
2470 bytes received via SQL*Net from client
167 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2482 rows processed
PARALLEL(table[, degree[, instances]])
作用:将全表扫描的查询分成多个部分,在不同进程中处理。
注意:该提示只对分区表有效。该提示对delete、update、insert同样有效
例子:略
NOPARALLEL(table)
作用:指定不使用并行查询。
注意:该提示只对分区表有效
例子:略
APPEND
作用:不检查是否有插入所需要的足够空间,直接添加到新块中。
注意:使用该提示必须保证有足够的空间
提示: 在insert中使用parallel提示默认会使用append
例子:略
NOAPPEND
作用:指定不使用append方式。当使用parallel提示时,会默认使用append,可以使用该提示使append无效
例子:略
CACHE(table)
作用:对指定进行全表扫描的表固定到内存中。对于经常要查询的小表可以使用CACHE提示。
提示: 在建表时使用cache子句,可以直接将表中数据存入内存
alter table t_wei cache;
例子:略
NOCACHE(table)
作用:对与已经指定CACHE将数据固定到内存中表,可以用NOCACHE从内存移出。
例子:略
CLUSTER
作用:强制使用聚簇扫描访问表。如果经常访问连接表,但又很少修改它,可以使用聚簇表。
例子:略
HASH(table)
作用:强制使用HASH聚簇。
注意:只有基于代价的优化器规则才能使用HASH聚簇。并且HASH_JOIN_ENABLED要为TRUE,PGAA_GGREGATE_TARGET、HASH_AREA_SIZE要足够大。
例子:略
CURSOR_SHAREING_EXACT
作用:强制使参数CURSOR_SHARING为FORCE或SIMILAR。
例子:略
RICHS_SECRET_HINT
作用:强制只访问内存中的数据。对于不使用索引的全表扫描有效。
例子:略