1.SQL语句尽量用大写的;
因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。
2.选择最有效率的表名顺序
oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表
将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表
是指那个被其他表所引用的表。
3.WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他
WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
4.SELECT子句中避免使用 *
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字
典完成的, 这意味着将耗费更多的时间
5.用EXISTS替换DISTINCT
当SQL包含一对多表查询时,避免在SELECT子句中使用DISTINCT,一般用EXIST替换,EXISTS
查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果
SELECT DISTINCT USER_ID,BILL_ID FROM USER_TAB1 D,USER_TAB2 E
WHERE D.USER_ID= E.USER_ID;
SELECT USER_ID,BILL_ID FROM USER_TAB1 D WHERE EXISTS(SELECT 1
FROM USER_TAB2 E WHERE E.USER_ID= D.USER_ID);
6.用EXISTS替代IN、用NOT EXISTS替代 NOT IN:?0?2
在基于基础表的查询中经常需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT
EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无
论在哪种情况下,NOT IN都是最低效的(要对子查询中的表执行了一个全表遍历)。所以尽量将
NOT IN改写成外连接(Outer Joins)或NOT EXISTS。
7.用>=替代>
SELECT * FROM TEMP WHERE ID >=4;
SELECT * FROM TEMP WHERE ID >3;
区别:前者将直接跳到第一个ID等于4的记录而后者将首先定位到ID=3的记录并且向前扫
描到第一个ID大于3的记录。
8.WHERE子句尽量走索引
某些SELECT 语句中的WHERE子句不使用索引
'!='与 is not null 不走索引。索引只能告诉我们什么存在于表中, 而不能告诉你什么不在表中。
'||'是字符连接函数。就象其他函数那样, 停用了索引。
'+'是数学函数。和其他数学函数一样, 停用了索引。