Oracle 查询优化
用[NOT] EXISTS代替[NOT] IN
在子查询中,[NOT] IN子句将执行一个内部的排序与合并,无论在哪种情况下,[NOT] IN语句都是最低效的,因为它对子查询中的表执行了一个全表遍历。为了避免使用[NOT] IN,用户可以把它改写成外连接(outer joins)、NOT EXISTS或者EXISTS子句,如下面的两段代码。第一种:低效率的NOT IN子句。select u.* from user u where u.id in (select uu.id from user uu where uu.name like '%a%');第二种:高效率的EXISTS子句。select u.* from user u where exists (select uu.id from user uu where uu.name like '%a%' and uu.id=u.id);在SQL语句中,许多资料都建议最好不用[NOT] IN。那么,[NOT] IN在何处可以用呢?这里要一分为二地看[NOT] IN,即当[NOT] IN后面跟子查询,并且查询的结果集较多时,不宜使用[NOT] IN;但如果[NOT] IN后面的括号内是列表(可枚举的几个)或子查询所满足的结果集很小时,也是可以使用的。
WHERE子句的连接顺序
可以过滤掉最大数据记录的条件必须写在WHERE子句的末尾,也就是在表进行连接操作以前,过滤掉的记录越多越好
避免全表扫描
全表扫描就是指不加任何条件或没有使用索引的查询语句。以下情况Oracle就可以使用全表扫描。 1:所查询的表没有索引。2:需要返回所有的行。 3:带LIKE并使用‘%’这样的语句就是全表扫描。4:对索引主列有条件限制,但使用了函数,则Oracle使用全表扫描,比如下面的代码:SQL> select * from emp where substr(ename,1,1)='M'; 5:带有is null、is not null或!=等字句也导致全表扫描,比如下面的代码:SQL> select * from emp where job!='MANAGER' ;合理使用索引
WHERE从句频繁使用的关键字。 SQL语句中频繁使用进行表连接的关键字。 对于取值较少的关键字或表达式,不要采用标准的B树索引,可以考虑建立位图索引。 不要将那些频繁修改的列作为索引列。 不要使用包含操作符或函数的WHERE从句中的关键字作为索引列,如果需要的话,可以考虑建立函数索引。 如果大量并发的INSERT、UPDATE、DELETE语句访问了父表或者子表,则考虑使用完整性约束的外部键作为索引。 在选择索引列时,还要考虑该索引所引起的INSERT、UPDATE、DELETE操作是否值得。

浙公网安备 33010602011771号