当前位置: 代码迷 >> SQL >> Oracle SQL 揭示
  详细解决方案

Oracle SQL 揭示

热度:410   发布时间:2016-05-05 14:44:39.0
Oracle SQL 提示
1、FIRST_ROWS
?? 指示优化器尽可能快地返回前n行记录,提高响应速度。如果没有指定参数,则返回第一行。该提示对Update和Insert无效,对包含块操作的select语句无效,如排序和group。 这样的语句不能优化最佳响应时间,因为Oracle在返回第一行之前,必须获得所有的记录。如果在这种情况下使用了该提示,优化器会优化最佳吞吐量(相当于ALL_ROWS提示)。
?
2、FULL
?? 指示优化器执行全表扫描,即使有索引,也不会走索引。
??
??? SELECT ? /**/ /* +?FULL(e)? */ ?employee_id,?last_name
??????
FROM ?hr.employees?e? WHERE ?last_name? LIKE ?:b1;
??
?? 注意:如果表有别名,则必须使用别名。并且即使表加上了schema名称,在提示中也不能指定schema名称。
?
3、HASH
?? 指示优化器使用Hash扫描表,只适用于表簇中的表。
?
4、INDEX
?? 指示优化器适用Index扫描表,适用于函数、域、B树、位图和位图联合索引。
?? Index提示遵循以下规范:
?? a、如果Index提示指定单个的索引,那么数据库执行该索引上的扫描,优化器不会执行全表扫描或者表上的其他索引。
?? b、对于指定了多个索引的组合的Index提示,Oracle推荐使用INDEX_COMBINE而不是INDEX提示,因为它更加通用,如果Index提示指定了index列表,那么优化器会考虑走每个索引的代码,并从中选择代价最小的一条索引,如果扫描多个index的代价最小,那么优化器会扫描该个索引列表。优化器不会走全表扫描或者没有在index列表上的索引。
?? c、如果Index提示没有指定Index,优化器会评估扫描每个Index的代价,并选择代价最小的Index,如果组合Index代价最小,那么优化器会选择扫描多个索引,并合并结果集。优化器不会走全表扫描。
?
??? SELECT ? /**/ /* +?INDEX?(employees?emp_department_ix) */ ??employee_id,?department_id
????
FROM ?employees? WHERE ?department_id? > ? 50 ;
?
5、INDEX_ASC
?? 按索引值的升序方向扫描索引,其他参数与INDEX 提示完全一样。
?
6、INDEX_COMBINE
?? 联合索引提示。索引规则与INDEX提示一样。
??
??? SELECT ? /**/ /* +?INDEX_COMBINE(e?emp_manager_ix?emp_department_ix)? */ ? *
FROM ?employees?e
WHERE ?manager_id? = ? 108
OR ?department_id? = ? 110 ;
?
7、INDEX_DESC
? 降序INDEX提示。
?
SELECT ? /**/ /* +?INDEX_DESC(e?emp_name_ix)? */ ? *
FROM ?employees?e;
?
8、INDEX_FFS
? 指示优化器执行快速全索引扫描,而不是全表扫描。
?
SELECT ? /**/ /* +?INDEX_FFS(e?emp_name_ix)? */ ?first_name
FROM ?employees?e;
?
9、INDEX_JOIN
??以INDEX JOIN的方式扫描,必须存在足够少的INDEX,这些索引包含着查询中所有的列。
?
SELECT ? /**/ /* +?INDEX_JOIN(e?emp_manager_ix?emp_department_ix)? */ ?department_id
FROM ?employees?e? WHERE ?manager_id? < ? 110 ? AND ?department_id? < ? 50 ;
?
10、INDEX_SS
? 索引跳跃扫描提示。
?
11、LEADING
? 指定特定的表放在执行计划的前面,它比ORDERED提示更加通用。
? 如果因为Join路线的依赖关系而不能首先被Join,提示就会被忽略;如果指定了两个或者多个冲突的LEADING提示,则他们都会被忽略;如果指定了ORDERED提示,那么LEADING就会被忽略。
?
12、MERGE
??将视图合并到查询。
? 如果视图查询语句包含GROUP BY子句或者SELECT语句中用到了 DISTINCT,那么优化器能够将视图合并到查询语句中,合成的合并也能够合并IN子查询,如果IN子查询没有关联。
?
?? SELECT ? /**/ /* +?MERGE(v)? */ ?e1.last_name,?e1.salary,?v.avg_salary
FROM ?employees?e1,
(
SELECT ?department_id,? avg (salary)?avg_salary
FROM ?employees?e2
GROUP ? BY ?department_id)?v
WHERE ?e1.department_id? = ?v.department_id? AND ?e1.salary? > ?v.avg_salary;
?
13、NOAPPEND
?? 在并行模式中使用常规插入方法。
?
14、NOCACHE
?
15、NO_EXPAND
?
16、NO_FACT
?
17、NO_INDEX
?
18、NO_INDEX_SS
?
19、NO_MERGE
?
20、NO_PARALLEL
?? 覆盖了使用DDL语言创建或者更改table的PARALLEL参数的设置。
?
21、NO_PARALLEL_INDEX
?? 覆盖了使用DDL语言创建或者更改index的PARALLEL参数的设置。
?
22、NO_PUSH_PRED
??
23、NO_PUSH_SUBQ
?
24、NO_PX_JOIN_FILTER
??? 阻止优化器使用并行联合位图过滤器
?
25、NO_REWRITE
??? 使查询重写失效
?
26、NO_QUERY_TRANSFORMATION
??? 跳过所有查询转换,包括但不限于:OR-expansion、视图合并、无嵌套子查询、星型转换和物化视图重写。
?
27、NO_STAR_TRANSFORMATION
?
28、NO_UNNEST
?
29、NO_USE_HASH
?
30、ORDERED
  Ordered这个提示会要求列在SQL表达式FROM字句里的表格按照指定的顺序进行合并,FROM字句里的第一个表格会指定驱动表格(driving table)
?????? 指示优化器按照FROM子句出现的表顺序join表。Oracle推荐使用LEADING提示。
?
31、PARALLEL
?? 指示优化器使用指定数目的服务器去执行并行操作,包括SELECT、INSERT、MERGE、UPDATE和DELETE部分的语句和表扫描部分都可使用。
?? 注意:如果发生sort或者group,那么服务器的数量应该是提示指定的两倍。
?? 如果任何并行都被禁止,那么提示就会被忽略。
?? 如果指定了DEFAULT或者没有指定任何值,那么查询器就会去检查初始参数的设置来决定并行度。
?? 临时表上的该提示将会被忽略。
?
32、PARALLEL_INDEX
?? 为分区索引指定并行索引扫描的数量。示例:
??? SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */
?
33、PQ_DISTRIBUTE
?
34、PUSH_PRED
?
35、PUSH_SUBQ
?
36、REWRITE
??? 对物化视图使用查询重写。
  相关解决方案