Oracle SQL语句之常见优化方法总结--不定更新

1、SQL语句尽量用大写的;

 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

2、WHERE子句中的连接顺序: 

 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他

WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

3、SELECT子句中避免使用 * : 

 ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字

典完成的, 这意味着将耗费更多的时间。

4、减少访问数据库的次数(使用游标等等): 

 ORACLE在内部执行了许多工作: 解析SQL语句,估算索引的利用率,绑定变量,读数据块等。

5、避免使用耗费资源的操作: 

 带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL引擎执行

耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。

通常,带有UNION、MINUS、INTERSECT的SQL语句都可以用其他方式重写。

 如果数据库的SORT_AREA_SIZE调配得好,使用UNION,MINUS,INTERSECT也是可以考虑。 

6、优化GROUP BY: 

 提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉。

下面两个查询返回相同结果但明显第二个效率更高。 

低效:

1 SELECT JOB,AVG(AGE) FROM TEMP 
2  GROUP BY JOB HAVING JOB = 'STUDENT' OR JOB = 'MANAGER';

高效:

SELECT JOB,AVG(AGE) FROM EMP 
WHERE JOB = 'STUDENT' OR JOB = 'MANAGER' GROUP BY JOB;

7、用>=替代>:

高效: 

SELECT * FROM TEMP WHERE ID >=4;

低效:

SELECT * FROM TEMP WHERE ID >3;

原因:前者DBMS将直接跳到第一个ID等于4的记录而后者将首先定位到ID=3的记录并且向前扫描到第一个ID大于3的记录。  

8、避免在索引列上使用计算: 

低效:

SELECT … FROM TEMP WHERE SAL * 12 > 25000;

高效:

SELECT … FROM TEMP WHERE SAL > 25000/12;
原文地址:https://www.cnblogs.com/smellpawn/p/10790734.html