一、性能优化
1.对于一些大表,尤其是大表关联的操作,书写SQL语句时,一定要特别注意;
建议先使用PL/SQL developer等工具,查看sql语句执行计划,优化后再写进代码。
2.Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表中,再执行主查询。
而EXIST则是首先检查主查询,然后运行子查询,直到找到第一个匹配项。
3.NOT EXISTS比NOT IN效率稍高,但在选择IN或EXIST操作时,要根据主、子表数据量大小来具体考量。
4.不必要的排序操作。
当在SQL中包含排序语句时,会引起系统进行排序操作;
排序是非常昂贵的操作,如果能够避免就要尽量不写。
5.当向Oracle提交一个SQL语句,Oracle会首先在共享池中,查找相同的语句;
需要说明的是,Oracle对两者采取的是一种严格匹配,要达到共享,SQL语句必须完全相同(包括空格、换行等)。
二、查询语句优化
1.创建索引。
create index index_name on table_name (column_name);
只要你查询使用到建了索引的字段,一般都会用到索引。
——创建表create table aaa
(
a number,
b number
);
——创建索引create index idx_a on aaa (a);
——使用索引select * from aaa where a=1;
这句查询就会使用索引idx_a。
2.减少表之间的关联。
2.1.内连接select e.ename, d.dname from emp e, dept d
where e.deptno = d.deptno;
上面的语法,也可以写为:
select e.ename,d.dname from emp e JOIN dept dON (e.deptno = d.deptno);
2.2.外连接的语法select table1.column, table2.column
from table1 [LEFT | RIGHT | FULL] JOIN table2
ON table1.column = table2.column2;
2.3.全外连接select e.ename, d.dname from emp e FULL OUTER JOIN dept d
ON e.deptno = d.deptno;
2.4.自连接select worker.empnow_empno, worker.enamew_ename,
manager.empnom_empno, manager.enamem_ename
from emp worker JOIN emp manager
ON worker.mgr = manager.empno;
3.优化SQL,尽量让SQL很快定位数据;不要让SQL做全表查询,应该走索引,把数据量大的表排在前面。
4.简化查询字段,没用的字段不要;以及对返回结果的控制,尽量返回少量数据。
5.尽量用PreparedStatement(预编译)来查询,不要用Statement。
三、查询语句执行顺序
查询语句的执行顺序,依下列子句次序:
1.from子句:执行顺序为从后往前、从右到左;——数据量较少的表,尽量放在后面
2.where子句:执行顺序为自下而上、从右到左;——将能过滤掉最大数量记录的条件,写在where子句的最右
3.group by:执行顺序为从左往右分组;——最好在group by前,使用where将不需要的记录过滤掉
4.having子句:消耗资源;——尽量避免使用,having会在检索出所有记录之后,才对结果集进行过滤、排序等操作
5.select子句:少用 * 号,尽量取字段名称;——oracle在解析的过程中,通过查询数据字典,将 * 号依次转换成所有的列名,消耗时间
6.order by子句:执行顺序为从左到右排序,消耗资源。