大家来谈谈哪些情况可以导致索引失效

我纯洁全身都纯洁 2014-02-20 04:31:00
今天写了一条sql,执行的时候发现用时非常长,以至于查不出结果。
后来发现是一个有索引的字段使用了like 和 upper()导致了索引失效。
然后我就试了以下几种都会使索引失效
!=、is null、like、+/-、upper/lower(upper(A.NAME) = 'name'这种情况)
在ORACLE中到底有哪些情况会导致索引失效呢?
...全文
568 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
上面一个图发错了
加上AND upper(A.CONTRACT_CODE) = 'd'是这样的
水猿兵团五哥 2014-02-20
  • 打赏
  • 举报
回复
这么多表,数据量一大肯定要慢 你先看看每个表的执行情况,然后看看到底是加到哪个条件或者哪个表才慢
  • 打赏
  • 举报
回复
引用 11 楼 hjgzj 的回复:
[quote=引用 10 楼 machong8183 的回复:]
[quote=引用 9 楼 hjgzj 的回复:]
[quote=引用 5 楼 machong8183 的回复:]
这个不叫索引失效,确切的说,是你的查询没有走索引,对不?

好像是 我不太懂[/quote]
看执行计划,上sql,上表结构[/quote]

SELECT A.CONTRACT_ID,
A.CONTRACT_CODE,
A.CUST_ID,
A.PROJECT_NAME,
A.EFF_DATE,
A.EXP_DATE,
A.RENEWAL_FLAG,
A.SIGNATURE_DATE,
A.DEMAND_COMPLETED_DATE,
A.SALE_STAFF_ID,
A.SALE_PROPORTION,
A.SALE2_STAFF_ID,
A.SALE2_PROPORTION,
A.SALE_TYPE,
A.SALE_CODE,
A.STATE,
A.STATE_DATE,
A.CREATED_DATE,
A.UPDATE_DATE,
A.PARTY_TYPE,
A.PARTY_CODE,
A.COMMENTS,
A.LINKMAN_ID,
A.CHECK_PARTY_TYPE,
A.CHECK_PARTY_CODE,
A.CONTRACT_ORG_ID,
A.CONTRACT_TERM,
A.CANCEL_REASON,
A.CHECK_FAILURE_REASON,
FOR_COMM_QUERY.FORMAT_PRICE_VALUE_BY_CVBS(A.CHARGE, 0) CHARGE,
B.SUBS_ID,
B.SUBS_NAME,
C.SALE_TYPE_NAME,
E.ADDRESS,
E.ADDRESS_ID,
F.DISTRICT_NAME,
G.STREET_NAME,
H.ROAD_NAME
FROM CVBS_CONTRACT A,
CVBS_SUBS B,
CVBS_SALE_TYPE C,
CVBS_SUBS_ADDRESS D,
CVBS_ADDRESS E,
CVBS_DISTRICT F,
CVBS_STREET_INFO G,
CVBS_ROAD_INFO H
WHERE 1 = 1
AND A.CONTRACT_ID = B.CONTRACT_ID
AND A.SALE_TYPE = C.SALE_TYPE(+)
AND A.PARENT_CONTRACT_ID IS NULL
AND A.STATE IN ('E', 'G')
AND B.SUBS_ID = D.SUBS_ID
AND D.ADDRESS_ID = E.ADDRESS_ID
AND D.STATE = 'A'
AND D.ADDRESS_TYPE IN ('A', 'C')
AND E.ROAD_ID = H.ROAD_ID
AND F.DISTRICT_ID = G.DISTRICT_ID
AND G.STREET_ID = H.STREET_ID
--AND A.CONTRACT_CODE = 'd' 或者 AND upper(A.CONTRACT_CODE) = 'd'
AND EXISTS
(SELECT R.SUBS_ID
FROM (SELECT DISTINCT T.SUBS_ID
FROM IB_SUB_COMPANY_CONTRACT_SUBS T
WHERE 1 = 1
AND T.STATE = 'A'
) R
WHERE B.SUBS_ID = R.SUBS_ID)


A.CONTRACT_CODE = 'd':
AND upper(A.CONTRACT_CODE) = 'd':]
该字段是索引 上面的条件AND A.PARENT_CONTRACT_ID IS NULL不能省略掉[/quote]
图错了 AND upper(A.CONTRACT_CODE) = 'd'应该是
  • 打赏
  • 举报
回复
引用 10 楼 machong8183 的回复:
[quote=引用 9 楼 hjgzj 的回复:]
[quote=引用 5 楼 machong8183 的回复:]
这个不叫索引失效,确切的说,是你的查询没有走索引,对不?

好像是 我不太懂[/quote]
看执行计划,上sql,上表结构[/quote]

SELECT A.CONTRACT_ID,
A.CONTRACT_CODE,
A.CUST_ID,
A.PROJECT_NAME,
A.EFF_DATE,
A.EXP_DATE,
A.RENEWAL_FLAG,
A.SIGNATURE_DATE,
A.DEMAND_COMPLETED_DATE,
A.SALE_STAFF_ID,
A.SALE_PROPORTION,
A.SALE2_STAFF_ID,
A.SALE2_PROPORTION,
A.SALE_TYPE,
A.SALE_CODE,
A.STATE,
A.STATE_DATE,
A.CREATED_DATE,
A.UPDATE_DATE,
A.PARTY_TYPE,
A.PARTY_CODE,
A.COMMENTS,
A.LINKMAN_ID,
A.CHECK_PARTY_TYPE,
A.CHECK_PARTY_CODE,
A.CONTRACT_ORG_ID,
A.CONTRACT_TERM,
A.CANCEL_REASON,
A.CHECK_FAILURE_REASON,
FOR_COMM_QUERY.FORMAT_PRICE_VALUE_BY_CVBS(A.CHARGE, 0) CHARGE,
B.SUBS_ID,
B.SUBS_NAME,
C.SALE_TYPE_NAME,
E.ADDRESS,
E.ADDRESS_ID,
F.DISTRICT_NAME,
G.STREET_NAME,
H.ROAD_NAME
FROM CVBS_CONTRACT A,
CVBS_SUBS B,
CVBS_SALE_TYPE C,
CVBS_SUBS_ADDRESS D,
CVBS_ADDRESS E,
CVBS_DISTRICT F,
CVBS_STREET_INFO G,
CVBS_ROAD_INFO H
WHERE 1 = 1
AND A.CONTRACT_ID = B.CONTRACT_ID
AND A.SALE_TYPE = C.SALE_TYPE(+)
AND A.PARENT_CONTRACT_ID IS NULL
AND A.STATE IN ('E', 'G')
AND B.SUBS_ID = D.SUBS_ID
AND D.ADDRESS_ID = E.ADDRESS_ID
AND D.STATE = 'A'
AND D.ADDRESS_TYPE IN ('A', 'C')
AND E.ROAD_ID = H.ROAD_ID
AND F.DISTRICT_ID = G.DISTRICT_ID
AND G.STREET_ID = H.STREET_ID
--AND A.CONTRACT_CODE = 'd' 或者 AND upper(A.CONTRACT_CODE) = 'd'
AND EXISTS
(SELECT R.SUBS_ID
FROM (SELECT DISTINCT T.SUBS_ID
FROM IB_SUB_COMPANY_CONTRACT_SUBS T
WHERE 1 = 1
AND T.STATE = 'A'
) R
WHERE B.SUBS_ID = R.SUBS_ID)


A.CONTRACT_CODE = 'd':
AND upper(A.CONTRACT_CODE) = 'd':]
该字段是索引 上面的条件AND A.PARENT_CONTRACT_ID IS NULL不能省略掉
水猿兵团五哥 2014-02-20
  • 打赏
  • 举报
回复
引用 9 楼 hjgzj 的回复:
[quote=引用 5 楼 machong8183 的回复:] 这个不叫索引失效,确切的说,是你的查询没有走索引,对不?
好像是 我不太懂[/quote] 看执行计划,上sql,上表结构
  • 打赏
  • 举报
回复
引用 5 楼 machong8183 的回复:
这个不叫索引失效,确切的说,是你的查询没有走索引,对不?
好像是 我不太懂
  • 打赏
  • 举报
回复
引用 7 楼 hjgzj 的回复:
方便面的世界果然难以理解。。难道是你却火腿肠吗?
结贴给分,废话那么多
  • 打赏
  • 举报
回复
方便面的世界果然难以理解。。难道是你却火腿肠吗?
  • 打赏
  • 举报
回复
引用 3 楼 Hsuifengershi 的回复:
[quote=引用 1 楼 dongzeviva 的回复:] 我梦见我前女友死了,我哭的稀里哗啦的!
我举报路上 话说 索引不是 主键 唯一件 这些么[/quote]你怎么可以这样
水猿兵团五哥 2014-02-20
  • 打赏
  • 举报
回复
这个不叫索引失效,确切的说,是你的查询没有走索引,对不?
  • 打赏
  • 举报
回复
1.函数 2.表达式 3.部分隐式转换 4.like和substr 5.查询所有null值 6.否定形式
  • 打赏
  • 举报
回复
引用 1 楼 dongzeviva 的回复:
我梦见我前女友死了,我哭的稀里哗啦的!
我举报路上 话说 索引不是 主键 唯一件 这些么
叫我猫爷_ 2014-02-20
  • 打赏
  • 举报
回复
围观中

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧