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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 5.多表查询 多表查询 目的:从多张表获取数据 前提:进行连接的多张表中有共同的列 等连接 通过两个表具有相同意义...
    乔震阅读 1,304评论 0 0
  • 查询是数据的一个重要操作。用户发送查询请求,经编译软件变异成二进制文件供服务器查询,后返回查询结果集给用户,查询会...
    产品小正阅读 1,435评论 0 2
  • 1. select * from emp; 2. select empno, ename, job from em...
    海纳百川_4d26阅读 1,938评论 0 4
  • mysql数据库中 :database : 文件夹table : 数据表(数据文件) 进入mysqlmysql -...
    赋闲阅读 579评论 0 0
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,776评论 0 2