- IS NULL 和 IS NOT NULL
包含NULL值的列都将不会包含在索引中。任何在 where 子句中使用 is null和is not null 的语句优化器是不允许使用索引的。导致引擎放弃索引采用全表扫描
- 选择最有效率的表名顺序:
oracle解析器按照从右到左的顺序处理from字句中的表名,from字句中写在最后的表(基础表driving table)将被最先处理,在from字句中包含多个表的情况下,选择记录条数最少的表作为基础表。如果有三个以上的表连接查询,选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表
- WHERE 字句中的连接顺序:
oracle采用自下而上的顺序解析WHERE字句,a.表之间的连接写在其它WHERE条件之前,b.可以过滤掉最大数量记录的条件必须写在WHERE字句的末尾
- 使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
5.用 >= 替代 >:
高效:
SELECT * FROM EMP WHERE DEPTNO >=4
低效:
SELECT * FROM EMP WHERE DEPTNO >3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.
- 容易导致放弃索引采用全表扫描的情形:
- where 子句中进行null值判断,可以采取设定默认值,采用等于默认值查询
- 使用 != 或 <> 操作符
- 使用or来连接条件
- in 和 not in 慎用,如果是连续的值采用 between
- 模糊查询
- WHERE 语句中对字段进行表达式操作
select id from t where num/2=100 应改为: select id from t where num=100*2
- where 子句中对字段进行函数操作
- 在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算
- 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致