1. 避免复杂的多表关联
2. 避免使用select *
3. 避免使用耗费资源的操作:带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL
可以:
- 用EXISTS替换DISTINCT
- 用UNION-ALL 替换UNION ( if possible)
4. 如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.
5. 避免在索引列上使用函数,SAL> 25000/12优于SAL * 12 > 25000
6. 避免使用前置通配符.如LIKE '%109204421';
7. 避免在索引列上使用NOT.如DEPT_CODE > 0优于DEPT_CODE NOT = 0
8. 在索引列上使用 IS NULL和IS NOT NULL是不允许使用索引的。
9. 避免出现索引列自动转换. 如 TO_NUMBER(USER_NO) = 109204421
10. WHERE子句中的连接顺序. ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理, 当在WHERE子句中有多个表联接时,WHERE子句中排
在最后的表应当是返回行数可能最少的表,有过滤条件的子句应放在WHERE子句中的最后。
11. 任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立
另外一个索引,同时应绝对避免在order by子句中使用表达式。
12. 避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限
制记录的数目,那就能减少这方面的开销.
13. 用NOT EXISTS 替代 NOT IN
14. 用>= 替代 >
15. 通过使用>=、<=等,避免使用NOT命令. 如 salary<3000 or salary>3000优于salary <> 3000
16. 尽量多使用COMMIT.事务是消耗资源的,大事务还容易引起死锁
17. 用TRUNCATE替代DELETE