SQL语句的优化策略
鉴于SQL优化过程较为繁杂,且易受环境条件制约,在开发阶段编写SQL时,务必恪守以下几项基本原则:
- ORACLE按照自底向上的顺序解析WHERE子句,基于此原理,表间的连接操作需置于其他WHERE条件之前,而能过滤掉最多记录的条件则应放置于WHERE子句的尾部。
例如:
(低效)
SELECT… FROM EMP E WHERE SAL> 50000 AND JOB=‘MANAGER’ AND 25<(SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);
(高效)
SELECT… FROM EMP E WHERE 25<(SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL> 50000 AND JOB=‘MANAGER’;
- 避免在SELECT子句中使用‘*’
在SELECT子句中罗列所有列时,使用动态SQL列引用‘’虽简便,实则效率低下。实际上,ORACLE在解析过程中会将‘’逐个转换为所有列名,这一过程需通过查询数据字典完成,从而消耗更多时间。
- 使用表的别名(Alias)
在SQL语句连接多个表时,请使用表的别名,并将别名置于每个Column之前。这样做可以减少解析时间,并降低因Column歧义而产生的语法错误。
注:Column歧义是指不同表中存在相同Column名的情况,当SQL语句中出现该Column时,SQL解析器无法确定其归属。
SQL调优的多重途径
您好,
以下是一些SQL优化方法:
对查询进行优化,应尽量避免全面扫描,首先考虑在WHERE及ORDER BY涉及的列上创建索引。
避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描。
避免在WHERE子句中使用!=或<>操作符,否则将导致引擎放弃使用索引而进行全表扫描。
避免在WHERE子句中使用or连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
仔细使用in和not in,否则可能导致全表扫描。
以下查询也将导致全表扫描:
select id from t where name like'%abc%'
避免在WHERE子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
避免在WHERE子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
不要在WHERE子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统可能无法正确使用索引。
在使用索引字段作为条件时,如果该索引是复合索引,则必须使用到该索引中的第一个字段作为条件,以确保系统使用该索引。同时,应尽可能让字段顺序与索引顺序保持一致。