概述: 本篇文章将探讨以下具体技术。
重点:对SQL语句应用提示(hint);
存储提纲——
以后研究;
使用11g的计划基线(baseline)以保证优化器在未来沿着一个更高效的方向发展。——
以后研究。
1. 提示
提示可以包含在SQL语句中用来指示或者引导优化器的指令。可以使用提示来指定联接的顺序、访问路径的类型、使用索引、优化的目标以及其他指令。 使用提示时,需要十分小心,因为哪怕会导致灾难性的性能影响,优化器仍将视图遵从提示。一般来讲,
只有当用尽非直接方法(收集统计信息、创建直方图、配置参数等)之后,才可以考虑使用提示。
提示的语法。以
/*+ 开头,以
*/ 结尾。 如 下面的语句中的注释会导致对staff表的全表扫描,即使优化器通常会选择一个基于索引的检索。
SELECT
/*+ FULL(s)
*/ *
FROM staff s
WHERE s.birth = 1984
AND s.staff_sex = 'M'
下面是一些常见的提示。
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
ALL_ROWS 使用ALL_ROWS优化器目标
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
AND_EQUALS
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
APPEND 使用直接模式插入
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
CACHE(表名称) 当执行全表扫描操作时,促进表在Oracle共享内存中的
缓存。与NOCACHE 相反。
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
FIRST_ROWS_N 使用FIRST_ROWS优化器目标,为提取前N条记录做优化
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
FULL(表名称) 使用全表扫描来访问指定的表,即使存在合适的索引访问
路径来访问数据。
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
HASH(表名称) 对指定的表使用基于散列聚簇的访问方式(显然,只有当表是
散列聚簇表时才有效)
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
INDEX(表名称[索引名称]) 使用指定表上的指定索引。如果没有指定索引列,则使用表
带来最低开销的那个索引列
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
NOPARALLEL(表名称) 不要使用并行查询,即使在表或者数据库默认通常会导致
并行处理的情况下
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
ORDERED 使用FROM子句中表出现的顺序作为连接的顺序。它将覆盖
普通的基于成本计算得出来的连接顺序
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
PARALLEL(表名称并行度) 这个提示特定的表应该使用并行扫描。并行度参数确定使用
多少个查询进程
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
USE_HASH
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
USE_NL 这个提示指定在表连接时,应该使用嵌套循环的方法
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- -
-
- - - -
相同的注释中可以同时出现多个提示,他们由一个空格分开。例如:
SELECT
/*+ FULL(s) FULL(d)
*/
*
FROM staff s JOIN
dep d USING(depid)
WHERE s. name ='zyj';