如何让oracle的select强制走索引

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

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

要点:

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏行者常至

pgsql编写触发器

670
来自专栏java系列博客

关于ORACLE merge into 的两个常见错误

1.4K3
来自专栏跟着阿笨一起玩NET

批量更新数据小心SQL触发器的陷阱

批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆!

2201
来自专栏跟着阿笨一起玩NET

(3)合并列值与分拆列值

在SQL中分拆列值和合并列值老生常谈了,从网上搜刮了一下并记录下来,以便不时之需 :)

781
来自专栏深度学习之tensorflow实战篇

SQL处理表结构的基本方法整理(创建表,关联表,复制表)

复制表结构及数据到新表 CREATE TABLE 新表 SELECT * FROM 旧表 只复制表结构到新表 CREATE TABLE 新表 SELECT * ...

3914
来自专栏测试开发架构之路

分分钟搞懂union与union all

SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的...

3409
来自专栏乐沙弥的世界

SQL基础--> 约束(CONSTRAINT)

约束是表、列级的强制规定、是防止那些无效或有问题的数据输入到表中。当对该表进行DML

802
来自专栏跟着阿笨一起玩NET

(2)SQL语句实现表的横向聚合

经过sql查询后输出的结果集为:(字段后面增加聚合[最大值] [最小值] [>=5的值个数])

921
来自专栏代码小睿

Medoo个人修改版

  Medoo是一款轻量级的php数据库操作类,下面不会介绍Medoo的使用方法,想学习Medoo请前往官网自学:http://medoo.in/   在接触M...

2527
来自专栏跟着阿笨一起玩NET

SQL中存储过程中使用事务,并且加入异常处理机制.

942

扫码关注云+社区