1. oracle自上而下解析where语句,表关联语句写在前面,过滤条件写在后面
2. 避免使用*查询(*操作是查询数据字典,耗时)
3. 子查询尽量减少对表的查询
select col1, col2 from t1 where col1 = (select col1 from t2 where ...)
4. 使用decode函数减少处理时间
5. 使用别名as
6. exists代替in,not exists代替not in
select * from A where exists (select * from B where B.id = A.id);
select * from A where A.id in (select id from B);
exists()适合B表比A表数据大的情况
in()适合B表比A表数据小的情况
无论那个表大,用not exists都比not in要快
7. 用exists代替distinct
8. oracle查询语句用大写,因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再执行
9. 避免索引列上使用not
10. 避免索引列上使用计算
select * from tab where col * 3 > 10 改为 select * from tab where col > 10/3
11. 用>=代替>
12. 用UNION替换OR (适用于索引列)
通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。如果有 column没有被索引,查询效率可能会因为你没有选择OR而降低。
13. 用IN来替换OR
14. 避免在索引列上使用IS NULL和IS NOT NULL
15. 某些SELECT 语句中的WHERE子句不使用索引
(1)‘!=' 将不使用索引。
(2)‘||'是字符连接函数。
(3)‘+'是数学函数。
(4)相同的索引列不能互相比较,这将会启用全表扫描。
16. a. 如果检索数据量超过30%的表中记录数,使用索引将没有显著的效率提高。
b. 在特定情况下,使用索引也许会比全表扫描慢,但这是同一个数量级上的区别。而通常情况下,使用索引比全表扫描要块几倍乃至几千倍!
17. 带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。通常,带有 UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写。如果你的数据库的SORT_AREA_SIZE调配得好。使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强。
18. 提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉。