1.SQL语句使用大写:因为oracle总是先解析sql语句,把小写字母转换成大写的再执行
2.索引:
a.避免在索引上使用NOT;
b.避免在索引列上使用计算;
c.不要在经常修改的字段上建索引,会影响update\insert\delete等操作效率;
d.避免在索引列上使用IS NULL和NULL;
e.总是使用索引的第一个列(组合索引的第一个列被where子句引用时,优化器才会选择使用该索引)
f.使用where替代order by(orderr by使用索引比较严格)
g.避免改变索引列的类型(oracle自动对列进行简单的类型转换,且会优先转换数值类型到字符类型)
h.某些where子句不适用索引('!=':索引只能告诉你什么存在于表中,而不能告诉你什么不存在;‘||’;‘+’像函数的会停止使用索引;相同索引列不能互相比较,这样会权标扫描)
i.检索数据量超过30%的表中记录数据,使用索引将没有显著的效果提高;
3.使用>=替代>:两者区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录,而后者将首先定位到DEPTNO=3的记录并且详情扫描到第一个DEPT大于3的记录;
4.禁止对大字段(varchar(2000))值进行order by\distinct\group by\union之类的操作,会消耗大量的CPU和内存资源;
5.两个表连接查询时,数据量小的表作为基础表(离from最远);三个及以上的表连接查询时,交叉表作为基础表;
6.避免使用select *;
7.使用where子句替换HAVING子句,HAVING只会检索出所有记录后才对结果进行过滤;
8.多表查询时,使用表的别名,检索解析时间、避免歧义引起的语法错误;
9.使用exists替代in、 用not exists替代not in、使用exists替换distinct(exists查询更为迅速,RDBMS核心模块将子查询的条件一旦满足立即返回结果);
10.识别’低效执行’的SQL语句
虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,SQL_TEXT FROM V$SQLAREA WHERE EXECUTIONS>0 AND BUFFER_GETS > 0 AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8 ORDER BY 4 DESC;