加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle数据库常用性能优化

发布时间:2020-12-12 14:29:19 所属栏目:百科 来源:网络整理
导读:1、 查两张以上表时,把记录少的放在右边 2、 WHERE子句中的连接顺序 ORACLE采用自上而下的顺序解析WHERE子句,根据这个原则,那些可以过滤掉最大数量记录的条件应写在WHERE子句最后。 例如:查询员工的编号,姓名,工资,部门名 如果emp.sal1500能过滤掉半数

1、 查两张以上表时,把记录少的放在右边

2、 WHERE子句中的连接顺序

ORACLE采用自上而下的顺序解析WHERE子句,根据这个原则,那些可以过滤掉最大数量记录的条件应写在WHERE子句最后。

例如:查询员工的编号,姓名,工资,部门名

如果emp.sal>1500能过滤掉半数记录的话,

selectemp.empno,emp.ename,emp.sal,dept.dname

from emp,dept

where (emp.deptno =dept.deptno) and (emp.sal > 1500)

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

ORACLE在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间

4、 避免对大表进行无条件或无索引的的扫描

5、 清空表时用TRUNCATE替代DELETE

6、 尽量多使用COMMIT;因为COMMIT会释放回滚点

7、 用索引提高查询效率,善用索引

避免在索引列上使用NOT;因为Oracle服务器遇到NOT后,他就会停止目前的工作,转而执行全表扫描。

避免在索引列上使用计算;WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描,这样会变得慢

例如,SAL列上有索引,

低效:

SELECT EMPNO,ENAME

FROM EMP

WHERE SAL*12 > 24000;

高效:

SELECT EMPNO,ENAME

FROM EMP

WHERE SAL > 24000/12;

8、字符串型,能用=号,不用like;=号表示精确比较,like表示模糊比较

9、 用 >= 替代 >

低效:

SELECT * FROM EMPWHERE DEPTNO > 3

首先定位到DEPTNO=3的记录并且扫描到第一个DEPT大于3的记录

高效:

SELECT * FROM EMPWHERE DEPTNO >= 4

直接跳到第一个DEPT等于4的记录

10、用IN替代OR

select * from emp where sal =1500 or sal = 3000 or sal = 800;

select * from emp where sal in (1500,3000,800);

11、用exists代替in;not exists代替 notin

not in字句将执行一个内部的排序和合并,任何情况下,not in是最低效的,子查询中全表扫描;表连接比exists更高效

12、用UNION-ALL 替换UNION

当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION,这样排序就不是必要了. 效率会因此得到提高。

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

带有DISTINCT,UNION,MINUS,INTERSECT的SQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作,而其他的至少需要执行两次排序. 通常,带有UNION,INTERSECT的SQL语句都可以用其他方式重写。

最后:同样的操作有些时候可以在程序上处理的就程序上处理,毕竟在内存中的执行速度比在硬盘上执行要高非常多。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读