问题描述
嗨,汤姆,
下面是我的表
以下是数据
发票 _ 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
我的查询是
我在inv_chk_id_date列中有一个日期,我必须提取该日期,并且需要在where子句中应用过滤器。
我的表中的记录不超过20百万,因此,如果我像上述查询一样应用过滤器,则执行时间非常长,
有什么方法可以加快上述查询
下面是我的表
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




