日期:2014-05-16  浏览次数:20388 次

略知三
1.ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
2. WHERE子句中的连接顺序 3. SELECT子句中避免使用 ‘ * ‘ 
错误写法:select * from tablename;
9. 用>=替代> 
高效: SELECT * FROM EMP WHERE DEPTNO >=4 ;
低效: SELECT * FROM EMP WHERE DEPTNO >3 ;
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. 
10. 优化GROUP BY
提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果,但第二个明显就快了许多. 
低效: SELECT JOB , AVG(SAL) FROM EMP 
        GROUP BY JOB 
        HAVING JOB = ‘PRESIDENT’ OR JOB = ‘MANAGER‘;
 高效:SELECT JOB , AVG(SAL)  FROM EMP 
        WHERE JOB=‘PRESIDENT'OR JOB = ‘MANAGER' 
       GROUP BY JOB;
正确写法:select column1,column2….from tablename; 4. 用TRUNCATE替代DELETE 5. 使用表的别名 6. 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 7. 合理的使用索引提高查询效率 意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 8. 索引列失效情况 我们要避免在索引列上使用NOT,函数,‘!=’,‘||’运算符, 如果使用了就会导致索引列失效. 他就会停止使用索引转而执行全表扫描. 避免在索引列上使用IS NULL和IS NOT NULL 尽量使用前端匹配的模糊查询(like),以通过使用索引来避免全表扫描。例如,column1 like ‘ABC%’方式,可以对column1字段进行索引范围扫描;而column1 like ‘%ABC%’方式,即使column1字段上存在索引,也无法使用该索引,只能走全表扫描。

?