Debug - Oracle索引未生效的问题

 

回到顶部(go to top)

问题描述

2022-09-26T14:13:02,065 [ComparableSecurity-thread-1] INFO  com.huatai.nats.api.impl.client.Client - Query done(total=6), sql=select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where TRADE_DATE in (20220919,20220920,20220921,20220922,20220923,20220926) and HEADS_SECURITY_ID in ('2105778.IB') and VALUATION_SOURCE  IN ('chinabond')
2022-09-26T14:13:02,065 [ComparableSecurity-thread-1] INFO  com.huatai.quant.utils.ComparableSecurityUtil - Query out [6] results, using sql query = [select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where TRADE_DATE in (20220919,20220920,20220921,20220922,20220923,20220926) and HEADS_SECURITY_ID in ('2105778.IB') and VALUATION_SOURCE  IN ('chinabond')]
2022-09-26T14:15:24,367 [ComparableSecurity-thread-1] INFO  com.huatai.nats.api.impl.client.Client - Query done(total=18), sql=select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where TRADE_DATE in (20220919,20220920,20220921,20220922,20220923,20220926) and HEADS_SECURITY_ID in ('2171116.IB' ,'2171266.IB' ,'2171269.IB') and VALUATION_SOURCE  IN ('chinabond')
2022-09-26T14:15:24,367 [ComparableSecurity-thread-1] INFO  com.huatai.quant.utils.ComparableSecurityUtil - Query out [18] results, using sql query = [select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where TRADE_DATE in (20220919,20220920,20220921,20220922,20220923,20220926) and HEADS_SECURITY_ID in ('2171116.IB' ,'2171266.IB' ,'2171269.IB') and VALUATION_SOURCE  IN ('chinabond')]

 

前后两个请求语句相差的时间是,2分22秒:

2022-09-26T14:13:02,065
2022-09-26T14:15:24,367

 

这是非常不正常的,查询【18】条数据就要2分22秒

但其实该表 FICC_DWODS.FICC_RDS_BOND_VALUATION 已经按照该sql语句的condition顺序建了索引

 

回到顶部(go to top)

问题分析

该索引已经存在,但不知道为何没有起效。

 

 

通过下方sql分析(两个sql要在一个界面里面,分别执行):

Explain plan FOR select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where 
TRADE_DATE in (20220919,20220920,20220921,20220922,20220923,20220926) 
and HEADS_SECURITY_ID in ('2171116.IB' ,'2171266.IB' ,'2171269.IB') 
and VALUATION_SOURCE  IN ('chinabond');

--查看索引使用明细
select plan_table_output from TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

 

发现这里是ACCESS FULL,说明是查询了全表。

里面有TO_NUMBER()去转换了tradeDate的格式,怀疑是因为格式问题未能走索引。

 

 

 

将原sql修改后,再次尝试分析是否走索引(两个sql要在一个界面里面,分别执行):

Explain plan FOR select * from FICC_DWODS.FICC_RDS_BOND_VALUATION where 
TRADE_DATE in ('20220919','20220920','20220921','20220922','20220923','20220926') 
and HEADS_SECURITY_ID in ('2171116.IB' ,'2171266.IB' ,'2171269.IB') 
and VALUATION_SOURCE  IN ('chinabond');

--查看索引使用明细
select plan_table_output from TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

 

修改后,说明走了索引!!!

 

 

回到顶部(go to top)

参考

oracle查看执行计划explain plan FOR:https://www.jianshu.com/p/bd4fe6ac3925

 

posted on   frank_cui  阅读(79)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2021-09-26 Redis - Redis 和 Memecache 有什么区别?
2021-09-26 Redis - Redis有哪些优缺点?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示