SQL性能优化

一、性能优化

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 d

ON (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子句:执行顺序为从左到右排序,消耗资源。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值