暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 需要为部分数据在列上创建索引

ASKTOM 2020-07-29
347

问题描述

嗨,汤姆,
下面是我的表

create table invoice_fact(
   invoice_id number(7),
  INV_CHK_ID_DATE varchar2(1000), 
 ACCOUNTING_DATE date,
INV_AMOUNT number(12,4)
);

以下是数据

发票 _ id帐户 _ 日期投资 _ 金额投资 _ chk _ id _ 日期
0000001 2016年3月19日10000.77 0000001 12 3月16 10000.77
0000002 2016年3月21日0000002 3月16 10070.74
0000003 14-3月-16 10124.7 0000003,2016年3月16日,10124.7
0000004 15-3月-16 10136.56 0000004,2016年3月17日,10136.56
0000005 16-3月-16 10190.35 0000005,2016年3月23日,10190.35
0000006 17-3月-16 10200.94 0000006,2016年3月20日,10200.94
0000007 18-3月-16 10255.44 0000007,2016年3月20日,10255.44
0000008 19-3月-16 10341.86 0000008,2016年3月20日,10341.86

我的查询是

select * from invoice_fact 
where to_date(substr(INV_CHK_ID_DATE,9,instr(INV_CHK_ID_DATE,',',1,2)-9),'DD-MON-RRRR') between '01-MAR-2016' and '01-MAR-2017'; 


我在inv_chk_id_date列中有一个日期,我必须提取该日期,并且需要在where子句中应用过滤器。

我的表中的记录不超过20百万,因此,如果我像上述查询一样应用过滤器,则执行时间非常长,
有什么方法可以加快上述查询

专家解答

添加虚拟列

alter table invoice_fact add inv_date date generated always as (  
  to_date(substr(INV_CHK_ID_DATE,9,instr(INV_CHK_ID_DATE,',',1,2)-9),'DD-MON-RRRR')
 )


现在,您可以在其上创建索引,选择它等。

如果附加列在代码中引起问题,则可以在该表达式上创建索引,即,

create index ix on invoice_fact 
 (  to_date(substr(INV_CHK_ID_DATE,9,instr(INV_CHK_ID_DATE,',',1,2)-9),'DD-MON-RRRR')  )

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论