来自:mjsws > 馆藏分类
配色: 字号:
Oracle索引优化规则
2018-07-22 | 阅:  转:  |  分享 
  
Oracle索引优化规则索引优化规则:1.like件中不要以通配符(WILDCARD)开始,否则索引将不被采用.例:SELECTLODG
INGFROMLODGINGWHEREMANAGERLIKE‘%HANMAN'';2.避免在索引列上使用计算或改变索引列的
类型或使用‘!=’及<>例:SELECT…FROMDEPTWHERESAL12>25000;SELECT…
FROMEMPWHEREEMP_TYPE=to_char(123);select….WhereACCOUNT_NAME
||ACCOUNT_TYPE=''AMEXA'';select…whereempno!=8888;3.避免在索引列上使用NOT
.4.用>=替代>.高效:SELECTFROMEMPWHEREDEPTNO>=4低效:SELECTFRO
MEMPWHEREDEPTNO>3两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DE
PTNO=3的记录并且向前扫描到第一个DEPT大于3的记录.?5.用UNION替换OR(适用于索引列)?通常情况下,用UNI
ON替换WHERE子句中的OR将会起到较好的效果.对索引列使用OR将造成全表扫描.注意,以上只针对多个索引列有效.如果有c
olumn没有被索引,查询效率可能会因为你没有选择O规则R而降低.捕鱼游戏http://www.44771.net?在下面的例子
中,LOC_ID和REGION上都建有索引.?高效:SELECTLOC_ID,LOC_DESC,REGIONFROM
LOCATIONWHERELOC_ID=10UNIONSELECTLOC_ID,LOC_DESC,REGIONF
ROMLOCATIONWHEREREGION=“MELBOURNE”?低效:SELECTLOC_ID,LOC_DE
SC,REGIONFROMLOCATIONWHERELOC_ID=10ORREGION=“MELBOURNE”
如果你坚持要用OR,那就需要返回记录最少的索引列写在最前面?注意:WHEREKEY1=10(返回最少记录)ORKEY
2=20(返回最多记录)ORACLE内部将以上转换为WHEREKEY1=10AND((NOTKEY1=10)
ANDKEY2=20)6.避免在索引列上使用ISNULL和ISNOTNULL避免在索引中使用任何可以为空的列,ORA
CLE将无法使用该索引.对于单列索引,如果列包含空值,索引中将不存在此记录.对于复合索引,如果每个列都为空,索引中同样不存在此
记录.如果至少有一个列不为空,则记录存在于索引中.(建议:可以给null值的字段设置一个默认值))7.???如果索引是建立在多个
列上,索引时段需要放在where条件的第一个条件(Oracle8i之前),Oracle8i之后允许跳跃式索引.8.(可能的话)
用UNION-ALL替换UNION.UNION-ALL就是做简单的合并,不会进行排序,UNION先做简单的合并,然后做进行排序,
最后去除重复的记录。9.避免使用耗费资源的操作带有DISTINCT,UNION,MINUS,INTERSECT,ORDERBY
的SQL语句会启动SQL引擎.?执行耗费资源的排序(SORT)功能.DISTINCT需要一次排序操作,而其他的至少需要执行两次
排序.?例如,一个UNION查询,其中每个查询都带有GROUPBY子句,GROUPBY会触发嵌入排序(NESTEDSORT
);这样,每个查询需要执行一次排序,然后在执行UNION时,又一个唯一排序(SORTUNIQUE)操作被执行而且它只能
在前面的嵌入排序结束后才能开始执行.嵌入的排序的深度会大大影响查询的效率.棋牌评测网http://www.77884.net?通常,带有UNION,MINUS,INTERSECT的SQL语句都可以用其他方式重写.?
献花(0)
+1
(本文系mjsws首藏)