SQL性能优化
SQL性能优化。
1、 查两张以上表时,把记录少的放在右边
2、 SELECT子句中避免使用*号
ORACLE在解析的过程中,会将*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间
3、 避免对大表进行无条件或无索引的的扫描
4、 清空表时用TRUNCATE替代DELETE
5、 尽量多使用COMMIT;因为COMMIT会释放回滚点
6、 用索引提高查询效率,善用索引
避免在索引列上使用NOT;因为Oracle服务器遇到NOT后,他就会停止目前的工作,转而执行全表扫描。
避免在索引列上使用计算;WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描,这样会变得慢
例如,SAL列上有索引,
低效:
SELECT EMPNO,ENAME
FROM EMP
WHERE SAL*12 > 24000;
高效:
SELECT EMPNO,ENAME
FROM EMP
WHERE SAL > 24000/12;
7、 字符串型,能用=号,不用like;=号表示精确比较,like表示模糊比较
8、 用 >= 替代 >
低效:
SELECT * FROM EMP WHERE DEPTNO > 3
首先定位到DEPTNO=3的记录并且扫描到第一个DEPT大于3的记录
高效:
SELECT * FROM EMP WHERE DEPTNO >= 4
直接跳到第一个DEPT等于4的记录
9、 用IN替代OR
select * from emp where sal = 1500 or sal = 3000 or sal = 800;
select * from emp where sal in (1500,3000,800);
10、 用exists代替in;not exists代替 not in
not in 字句将执行一个内部的排序和合并,任何情况下,not in是最低效的,子查询中全表扫描;表连接比exists更高效
11、 用UNION-ALL 替换UNION
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率会因此得到提高。
12、 避免使用耗费资源的操作
带有DISTINCT,UNION,MINUS,INTERSECT的SQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. 通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写。
13 通配符
– 不要过度使用通配符;通配符会降低效率
– 确实需要通配符时,不要将其用在 搜索模式 的开始处
最后;同样的操作有些时候可以在程序上处理的就程序上处理,毕竟在内存中的执行速度比在硬盘上执行要高非常多。
14 count()函数的效率
select count(1) from TableName 性能最高
select count(*) from emp 最低
select Count(age) from emp 居中
上一篇: oracle触发器demo分享