如何让oracle的select强制走索引

前端之家收集整理的这篇文章主要介绍了如何让oracle的select强制走索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

大多数情况下,oracle数据库内置的查询优化策略还是很成功的,但偶尔也有犯2的时候,即使有索引,也会做全表扫描,可以参考以下语句的写法,强制让select语句使用索引@H_301_2@

@H_301_2@
 1@H_301_2@ CREATE@H_301_2@ OR@H_301_2@ REPLACE@H_301_2@ VIEW@H_301_2@ V_RES_CBA AS@H_301_2@
 2@H_301_2@ SELECT@H_301_2@ /*@H_301_2@+INDEX(SEG IDX_T_RES_ALLOSEG_ALLOID)@H_301_2@*/@H_301_2@
 3@H_301_2@    ALLO.ALLOID AS@H_301_2@ RESID,@H_301_2@ 4@H_301_2@    NULL@H_301_2@ AS@H_301_2@ AWB, 5@H_301_2@    ALLO.ALLOTMENT AS@H_301_2@ ALLO_ID,128)"> 6@H_301_2@    DAYS.FDATE +@H_301_2@ NVL(SEG.DAYSDISP,0@H_301_2@) AS@H_301_2@ FDATE,128)"> 7@H_301_2@    ALLO.SPECULD AS@H_301_2@ SPECULD 
 8@H_301_2@     FROM@H_301_2@ T_RES_ALLO ALLO,T_RES_ALLOSEG SEG,V_FDATE DAYS
@H_301_2@ 9@H_301_2@    WHERE@H_301_2@ ALLO.ALLOID =@H_301_2@ SEG.ALLOID
@H_301_2@10@H_301_2@      AND@H_301_2@ ((ALLO.ALLOIND =@H_301_2@ '@H_301_2@A@H_301_2@'@H_301_2@ AND@H_301_2@ ALLO.ALLO_DATE =@H_301_2@ DAYS.FDATE) OR@H_301_2@
11@H_301_2@          (ALLO.ALLOIND S@H_301_2@AND@H_301_2@
12@H_301_2@          NVL(ALLO.SDATE,ALLO.ALLO_DATE) =@H_301_2@ DAYS.FDATE)) 
13@H_301_2@   UNION@H_301_2@
14@H_301_2@   15@H_301_2@    ALLO.ALLOID 16@H_301_2@    17@H_301_2@    ALLO.ALLOTMENT 18@H_301_2@    DAYS.FDATE 19@H_301_2@    ALLO.SPECULD 20@H_301_2@     21@H_301_2@    22@H_301_2@      AND@H_301_2@ ALLO.ALLO_DATE IS@H_301_2@ NULL@H_301_2@
23@H_301_2@      AND@H_301_2@ ALLO.ALLOIND '@H_301_2@
24@H_301_2@      AND@H_301_2@ (DAYS.FDATE >=@H_301_2@ ALLO.SDATE AND@H_301_2@ DAYS.FDATE <=@H_301_2@ ALLO.EDATE 25@H_301_2@          INSTR(ALLO.WEEKDAY,DAYS.WEEKDAY) >@H_301_2@ 0@H_301_2@) 
26@H_301_2@      AND@H_301_2@ NOT@H_301_2@ EXISTS@H_301_2@ (SELECT@H_301_2@ subQuery.ALLOID
@H_301_2@27@H_301_2@             from@H_301_2@ T_RES_ALLO subQuery
@H_301_2@28@H_301_2@            where@H_301_2@ subQuery.ALLO_DATE =@H_301_2@ DAYS.FDATE
@H_301_2@29@H_301_2@              and@H_301_2@ subQuery.ALLOTMENT =@H_301_2@ ALLO.ALLOTMENT)
@H_301_2@30@H_301_2@ ;
@H_301_2@

要点:

1、/*+INDEX(SEG IDX_T_RES_ALLOSEG_ALLOID)*/@H_301_2@这里的/*...*/中间不要有空格

2、表名要用别名,即:以上面的sql语句为例,要使用SEG@H_301_2@,而不是T_RES_ALLOSEG

作者: 菩提树下的杨过
出处: http://yjmyzz.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

猜你在找的Oracle相关文章