SQL优化

来源:互联网 发布:装修预算软件下载 编辑:程序博客网 时间:2024/06/06 05:53

1.Oracle解析sql是从右至左的。

对于where condition1 and condition2 来说,只要有一个条件为false,就不会再去解析另一个条件,所以我们要把false的条件放在右边。

对于where condition1 or condition2  来说,只要有有一个条件为true,就不会再去解析另一个条件,所以我们要把true的条件放在右边。


2.在使用GROUP BY的时候,如果HAVING 和 WHERE都可以使用的情况下,先使用WHERE,再使用having

原因:如果一张表中有五千万条数据,需求是查询10号部门的员工并按照其职务分组,然后计算他们的平均工资。假设10号部门的员工只有50条记录,如果这时候我们先GROUP BY JOB(按照职务来分组)那么10号部门以外的员工也会进行按职务的分组操作,也就是说五千万条的数据都要进行分组操作,所以说性能是很低的。如果我们先用WHERE语句,选出部门为10的员工,即只有50条记录,然后再对这50条记录进行职位的分组操作,并计算其分组后的平均工资,这时效率将大大提高。

注意:当条件里需要用到组函数的情况,那么GROUP BY只能用HAVING来作为筛选条件的语句。WHERE子句中是绝对不能用组函数的。

例如:

--查询平均工资大于2000的部门信息SELECT DEPTNO,AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) >2000;

3.在查询的时候尽量使用列名(Oracle 9i之后,*和列名是一样的)

4.查询部门名称为SALES的员工信息(子查询和多表查询都能完成任务,理论上来说多表查询效率高,因为下面的子查询进行了两次查询,但也不排除oracle公司已经优化。)

方法一(子查询):

SELECT * FROMEMPWHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES')
方法二(多表查询):

SELECT * FROMEMP E,DEPT DWHERE E.DEPTNO=D.DEPTNO AND D.DNAME='SALES'

5.尽量不要使用集合运算.union这种