Oracle 语句优化(整理1)
1*号引起的执行效率
尽量减少使用select * 来进行查询,当你查询使用*,数据库会进行解析并将*转换为全部列。因此尽量写明你所需要查询的字段名。
SELECT * FROM EMP;
SELECT EMP.NO FROM EMP;
2避免在索引列上使用计算
WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.
举例 :
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效 :
SELECT … FROM DEPT WHERE SAL > 25000/12;
3用 >= 替代 >
高效 :
SELECT * FROM EMP WHERE DEPTNO >=4
低效 :
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于 , 前者 DBMS 将直接跳到第一个 DEPT 等于 4 的记录而后者将首先定位到 DEPTNO=3 的记录并且向前扫描到第一个 DEPT 大于 3 的记录 .
4where执行顺序
where执行会从至下往上执行
SELECT * FROM STUDENT_INFO SI--学生信息表
WHERE SI.SCHOOL_ID=10 --学院ID
AND SI.SYSTEM.ID=100--系ID
摆放where子句时,把能过滤大量数据的条件放在最下边
5from字段中的优化:
Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表)。
比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据。因此把简单的数据少的基础表放在右侧可以提高速度。
当出现多个表时,关联表被称之为交叉表,交叉表作为基础表。
6where执行速度比having快
尽可能的使用where代替having,having只会在检索出所有记录之后才会对结果集进行过滤,这个过程需要排序,总计等操作。
7替换
用in 代替or
SELECT UI.USER_NAME
FROM USER_INFO UI--员工信息表
WHERE UI.STUDENT_ID=10
OR UI.STUDENT_ID=20
OR UI.STUDENT_ID=30
改成
SELECT UI.USER_NAME
FROM USER_INFO UI--员工信息表
WHERE UI.STUDENT_ID IN (10,20,30)
执行会更有效率。
8优化GROUP BY:
提高GROUP BY语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉.
关于索引,感觉里面的问题比较复杂,还没有详细了解。