1.FROM子句
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。
例如:t1 400W数据,t2 40数据
from t1,t2 优于 fromt2,t1
如果有第三张连接表,则将连接表放在最后作为基础表:
from t1,t2,t3 where t1.no=t3.no and t2.id=t3.id
2.WHERE子句
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
例如: select * FROM table1 where a='a' and b1='b' and c1='c'
table1有a,b,c三个属性,上面的sql会报错:C1标识符无效,改了之后执行,报B1标识符无效
重右往左解析sql,从下往上执行,建议把过滤量大的语句写在后面。尽量把精确条件往后写,表之间的连接必须写在其他WHERE条件之前。
精确条件 t1.a='a' 表连接条件t1.a=t2.a
3.避免使用 *
ORACLE在解析的过程中,会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的,这将耗费更多的时间。
4.用EXISTS替代IN,用于连接另一个表
5.使用大写
6.用>=替代> :
高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
7.使用表的别名
8.避免在索引列上使用IS NULL和IS NOT NULL
对于单列索引,如果列包含空值,索引中将不存在此记录。对于复合索引,如果每个列都为空,索引中同样不存在此记录。如果至少有一个列不为空,则记录存在于索引中。
9.使用索引
(1)‘!=' 将不使用索引。记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
(2)‘||'是字符连接函数。就象其他函数那样, 停用了索引。
(3)‘+'是数学函数。就象其他数学函数那样, 停用了索引。
(4)相同的索引列不能互相比较,这将会启用全表扫描。