24. 用 >= 替代 >
如果DEPTNO上有一个索引
两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录,而后者将首先定位到DEPTNO等于3的记录并且向前扫描到第一个DEPT大于3的记录.
25. 用Union替换OR(适用于索引列)
通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。 注意,以上规则只针对多个索引列有效。
26. 用IN替换OR
实际的执行效果还须检验,在ORACLE8i下, 两者的执行路径似乎是相同的。
27. 避免在索引列上使用is null和is not null
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。
28. 总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时, 优化器才会选择使用该索引。
很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引。
29. 使用UNION ALL替代UNION
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION,这样排序就不是必要了,效率就会因此得到提高。
由于UNION ALL的结果没有经过排序,而且不过滤重复的记录,因此是否进行替换需要根据业务需求而定。
30. 对UNION的优化
由于UNION会对查询结果进行排序,而且过滤重复记录,因此其执行效率没有UNION ALL高。 UNION操作会使用到SORT_AREA_SIZE内存块,因此对这块内存的优化也非常重要。
可以使用下面的SQL来查询排序的消耗量 :
31. 避免改变索引列的类型
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。
因为内部发生的类型转换,这个索引将不会被用到。
几点注意:
- 当比较不同数据类型的数据时,ORACLE自动对列进行简单的类型转换。
- 如果在索引列上面进行了隐式类型转换,在查询的时候将不会用到索引。
- 注意当字符和数值比较时,ORACLE会优先转换数值类型到字符类型。
- 为了避免ORACLE对SQL进行隐式的类型转换,最好把类型转换用显式表现出来。