先看下oracle的执行过程
在平时写sql的时候,会用得上的一些优化:
is null或者is not null
所有的sql语句一旦在where语句后面加上了is null或者is not null,那么oracl优化器就会不再使用索引。
使用%的语句
列举两个例子说明该问题:
查询user表中name带a的
例子1:Select *from user where name like ‘%a%’;
例子2:Select *from user where name like ‘a%’;
由于例1中通配符(%)在搜寻词首出现,所以oracle系统不使用name的索引,通配符会降低查询的效率,但当通配符不再词首出现,又能使用索引,如例2所示。
3.选择最有效的表名顺序
例如:TAB1 1000条记录, TAB2 只有1条记录
选择记录最少的作为基表
Select count(1) from tab1,tab2;
4.where在字句中的链接顺序
oracle的解析按照从上而下解析,因此表之间的连接必须写在where条件之前:
例:
低效率:
select counts(1) from
table t1
where size> 50000 and name= 'manager'
and 25
高效率:
select counts(1) from
table t1
where 25
and size> 50000 and name= 'manager';
5.truncate和delete
当删除一个表时,使用delete执行删除操作,回滚端需要用来存放可恢复的信息,在没有提交事务的时候,执行回滚事务,数据会恢复到执行delete操作之前,而当用truncate是,回滚端则不会存放可恢复的信息,减少资源的调用。
6.where和having
避免使用 HAVING 子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过 WHERE 子句限制记录的数目,那就能减少这方面的开销.
7.in和or
低效:
Select counts(1) from table where loc_id = 10 or loc_id = 20 or loc_id = 30
高效:
Select counts(1) from table where loc_in in (10,20,30);
领取专属 10元无门槛券
私享最新 技术干货