Oracle 语句优化(整理1)

2015-07-24  本文已影响77人  织田信长

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之前过滤掉.

关于索引,感觉里面的问题比较复杂,还没有详细了解。

上一篇 下一篇

猜你喜欢

热点阅读