1. 从多个表中选择记录时:(表名顺序)
执行顺序为从右往左,即表记录数少的放到右边,即最为基础表。如果有三个以上的表做连接查询,我们将交叉表作为基础表(即被其他表应用的表,即关系表)
2. WHERE子句中的连接顺序.
ORACLE按照自左向右的顺序执行,即那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最右边,即末尾。
对于SQL Server有两种说法,第一种:不用考虑顺序,SQLServer会自动执行过滤数据较多的条件;第二种:从左向右的执行顺序。 3.SELECT子句中一定避免使用 ‘ * ‘:
注意一定别是用* ,巨耗时。
4. 删除重复记录:
避免表中出现重复记录。
Oracle中最高效的删除重复记录方法的例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 5 尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 以便及时释放资源,提高性能。 COMMIT所释放的资源:如下 第一,回滚段上用于恢复数据的信息.第二,被程序语句获得的锁第三,redo log buffer 中的空间第四,ORACLE为治理上述3种资源中的内部花费
6 用Where子句替换HAVING子句: 避免使用HAVING子句, HAVING要检索所有记录后,才进行过滤,这个处理需要排序,总计等操作. 假如能通过WHERE子句限制记录的数目,那就能减少这方面的开销. 7 使用表的别名(Alias): 当在SQL语句中连接多个表时,使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. 8 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).
例子: (高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB') (低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB') 9 用索引提高效率: 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.。定期的重构索引是有必要的.: ALTER INDEX
(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO); 11 sql语句用大写的;
因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行 12 避免在索引列上使用NOT 通常
我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响. 当ORACLE”碰到”NOT,他就会停止使用索引转而执行全表扫描.
13 避免在索引列上使用计算. 假如索引列是函数的一部分.优化器将不使用索引而使用全表扫描.举例: 低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效: SELECT … FROM DEPT WHERE SAL > 25000/12;
14 用>=替代> 高效:SELECT * FROM EMP WHERE DEPTNO >=4
低效:SELECT * FROM EMP WHERE DEPTNO >3 两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
15 避免在索引列上使用IS NULL和IS NOT NULL 在索引中判空,将无法使用该索引. 低效: (索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL; 高效: (索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0; 16 需要当心的WHERE子句: 第一,!= 将导致索引无效
第二, '是字符连接函数. 将导致索引无效.
第三,+是数学函数 . 将导致索引无效.