Oracle索引优化规则

来源:未知 责任编辑:智问网络 发表时间:2013-11-12 17:22 点击:

 

索引优化规则:

1. like件中不要以通配符(WILDCARD)开始,否则索引将不被采用.

例:SELECT LODGING FROM LODGING

WHERE MANAGER LIKE ‘%HANMAN';

2.避免在索引列上使用计算或改变索引列的类型或使用‘!=’及<>

例: SELECT …FROM DEPT WHERE SAL * 12 > 25000;

SELECT … FROM EMP WHERE EMP_TYPE=to_char(123);

select …. Where ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';

select …where empno!=8888 ;

3.避免在索引列上使用NOT .

4.用>=替代> .

高效: SELECT * FROM EMP WHERE DEPTNO >=4

低效: SELECT * FROM EMP WHERE DEPTNO >3

两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.

•5.用UNION替换OR (适用于索引列)

• 通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择O规则R而降低.

 

在下面的例子中, LOC_ID 和REGION上都建有索引.

 

高效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10

UNION

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE REGION = “MELBOURNE”

• 低效:

SELECT LOC_ID , LOC_DESC , REGION

FROM LOCATION

WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面

• 注意:WHERE KEY1 = 10 (返回最少记录)

OR KEY2 = 20 (返回最多记录)

ORACLE 内部将以上转换为

WHERE KEY1 = 10 AND((NOT KEY1 = 10)AND KEY2 = 20)

6. 避免在索引列上使用IS NULL和IS NOT NULL

避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中.

(建议:可以给null值的字段设置一个默认值))

7.    如果索引是建立在多个列上,索引时段需要放在where 条件的第一个条件(Oracle8i之前),Oracle8i之后允许跳跃式索引.

8. (可能的话)用UNION-ALL 替换UNION.

UNION-ALL就是做简单的合并,不会进行排序,UNION先做简单的合并,然后做进行排序,最后去除重复的记录。

9.避免使用耗费资源的操作

带有DISTINCT,UNION ,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎.

 

执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序.

 

例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ; 这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行. 嵌入的排序的深度会大大影响查询的效率.

 

通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写.  

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Table函数使用简介
    • Oracle数据库Constraint约束的常用操作及异常处理
    • Bulk Collect性能分析(zz)
    • export/import的使用
    • OCP043第十五讲 Database Security
    • ORACLE10gr2数据导入MySQL方案
    • oracle 让sys用户可以使用isqlplus
    • 在oracle数据库下使用iSQL*Plus DBA访问数据库
    • Oracle行列转换小结
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1