对于Oracle性能调优来说,在初始设计的时候,按照Oracle 推荐的OMF进行安装配置之后是最优化的物理结构。
然而实际情况是这样的:大部分的性能很差的数据库,究其根本原因是为程序中的SQL代码很糟糕,很多程序员可能不清楚Oracle的体系结构,不知道Oracle对于一条sql是如何处理的,就会想当然的去写,造成语句未使用绑定变量,执行计划没有使用索引,大部分都是全表扫描。有时候部门就需要有一位对Oracle内部体系结构很清楚地DBA对开发人员进行培训,
有点儿悲剧的感觉。
好了,既然实际上是这样的,我在此就介绍一些优化的技巧:
Oracle 大概知道会有这样的情况,就给我们提供了一种优化的方案--提示
提示的基本语法是:
/*+ 提示名称 */
像一种注释,提示名称就是具体的一些提示语法关键字 如:FULL
写出来就像这个样子: select /*+ FULL (table) */ column1,..... from table
如果提示语法不正确,那也不用担心,除了没有达到预期的结果,也不会有什么影响,Oracle会忽略它。
语法: select /*+ FULL (table) */ column1,..... from table
其中的 table 是执行全表扫描的表名,如果使用了表的别名,那就必须使用别名,否则提示将不能工作。
示例:
select /*+ FULL(emp) */ *
from emp
where deptno= 1 ;
1.使用scott 用户连接示例数据库:
打开sql 跟踪, set autotrace on
2.不添加提示执行上述语句并且在 列deptno 有索引emp_deptno,输出的执行计划如下:执行的是索引范围扫描。
3.执行上述示例添加 FULL 提示执行结果如下: 执行计划执行的是全表扫描
提示:当一个表数据行不是很多的情况下,执行索引范围扫描比全表扫描要慢一些。
但是以上的图示去相反,全表扫描比索引范围扫描要慢,这是因为没有对表进行收集统计信息
4.执行表分析 analyze table emp compute statistics
在此执行上述SQL结果:
无FULL提示
有FULL提示:
对比以上结果可以看出,FULL提示对于优化某些小表是很有帮助的。