1,from的最右边放置数据量最少的表,也叫基础表


2,where的写法
ORACLE采用自下而上的顺序解析WHERE子句,
根据这个原理,表之间的连接必须写在其他WHERE条件之前,
那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.


3. SELECT子句中避免使用 ‘ * ‘


4.for的方式循环可能能提高游标的效率(有待检查)

5. 使用DECODE函G数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
例如:

SELECT COUNT(*),SUM(SAL)

FROM EMP

WHERE DEPT_NO = 0020

AND ENAME LIKE ‘SMITH%';


SELECT COUNT(*),SUM(SAL)

FROM EMP

WHERE DEPT_NO = 0030

AND ENAME LIKE ‘SMITH%';
你可以用DECODE函数高效地得到相同结果
SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,

COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,

SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,

SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL

FROM EMP WHERE ENAME LIKE ‘SMITH%';
类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.

 
6.用EXISTS替代IN

7.NOT EXISTS替换NOT IN


8.定期的重构索引是有必要的.

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>


9. 等式比较和范围比较
当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.
先进行等式比较

 
10. 不明确的索引等级
当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的.

11. 自动选择索引
如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性.
在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引.  

12. 用>=替代>


13. 总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.


14.‘!=' 将不使用索引
‘||'是字符连接函数. 就象其他函数那样, 停用了索引.
‘+'是数学函数. 就象其他数学函数那样, 停用了索引.

刚开通博客园,此篇里面的基本上都是我们使用sql语句中经常出现问题,最简单也最容易忽视,希望大家后续继续增加

posted on 2013-01-07 10:59  Charmi  阅读(173)  评论(0编辑  收藏  举报