oracle性能34条优化技巧
2013-06-23 17:37:25 来源:WEB开发网(12)减少对表的查询: 在含有子查询的SQL语句中,要特别注意减少对表的查询.
例子:SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VERFROM TAB_COLUMNS WHERE VERSION = 604)
(13)通过内部函数提高SQL效率.: 复杂的 SQL 往往牺牲了执行效率.能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的
(14)使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来, 就可以减少解析的时间并减少
那些由Column歧义引起的语法错误.
(15)用EXISTS替代IN、用NOTEXISTS 替代NOT IN: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下,使用EXISTS(或NOTEXISTS)通常将提高查询的效率.在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOTIN 都是最低效的(因为它对子查询中的表执行了一个全表遍历).为了避免使用 NOT IN ,我们可以把它改写成外连接(OuterJoins)或 NOT EXISTS.
例子: (高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0AND EXISTS (SELECT‘X' FROM DEPT WHERE DEPT.DEPTNO =EMP.DEPTNO AND LOC = ‘MELB')
(低效)SELECT* FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNOIN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')
(16)识别'低效执行'的SQL语句:虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法:
SELECTEXECUTIONS , DISK_READS, BUFFER_GETS,ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,ROUND(DISK_READS/EXECUTIONS,2)
Reads_per_run,SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS>0 AND BUFFER_GETS > 0 AND(BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 ORDER BY 4 DESC;
17) 用索引提高效率: 索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡 B-tree 结构. 通常,通过索引查询数据比全表扫描要快.
当ORACLE找出执行查询和 Update 语句的最佳路径时,ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.
另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证.。那些 LONG 或 LONG RAW数据类型, 你可以索引几乎所有的列.
通常,在大型表中使用索引特别有效. 当然,你也会发现,在扫描小表时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价.索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改.
这意味着每条记录的 INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理, 那些不必要的索引反而会使查询反应时间变慢.。
定期的重构索引是有必要的.: ALTER INDEX REBUILD
18) 用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在 SELECT子句中使用 DISTINCT. 一般可以考虑用EXIST 替换,EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.例子:
(低效):SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERE D.DEPT_NO =E.DEPT_NO
(高效):SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT „X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);
(19) sql语句用大写的;因为oracle 总是先解析sql 语句,把小写的字母转换成大写的再执行
(20)在java代码中尽量少用连接符“+”连接字符串!
赞助商链接