我正在使用oracle pl / sql,并且我在此查询中有一个存储过程,这有点令人费解,但是可以完成工作,事情需要35分钟,而sql开发人员Autotrace表示即使表具有索引,也进行完全扫描。
那么有什么方法可以改善这个查询?
select tipotrx, sum(saldo) as saldo,
count(*) as totaltrx from (
select max(ids) as IDTRX, max(monto) as monto, min(saldo) as saldo, max(aq_data) as aq_data, thekey, tipotrx
from (
select t.SID as ids, (TO_NUMBER(SUBSTR(P.P1, 18, 12))) as monto,
((TO_NUMBER(SUBSTR(P.P1, 18, 12)) * (TO_NUMBER(SUBSTR(t.acquirer_data, 13,2)) -
TO_NUMBER(SUBSTR(P.P4, 3,2))))) as saldo,
(TO_CHAR(t.trx_date, 'YYMMDD') || t.auth_code || t.trx_amount || (SELECT
functions.decrypt(t.card_number) FROM DUAL)) as thekey,
t.acquirer_data AS aq_data,
TO_NUMBER(SUBSTR(t.acquirer_data, 12, 1)) as tipotrx
from TBL_TRX t INNER JOIN TBL_POS P ON (t.SID = P.transaction)
WHERE (TO_NUMBER(SUBSTR(t.acquirer_data, 13,2)) >= TO_NUMBER(SUBSTR(P.P4, 3,2)))
AND trunc(t.INC_DATE) between (TO_DATE('20/06/2020', 'DD/MM/YYYY') - 35) AND TO_DATE('20/06/2020', 'DD/MM/YYYY')
) t
group by thekey, tipotrx order by max(ids) desc) j
group by tipotrx;
谢谢。
更改此:
trunc(t.INC_DATE) between (TO_DATE('20/06/2020', 'DD/MM/YYYY') - 35)
AND TO_DATE('20/06/2020', 'DD/MM/YYYY')
对此:
t.INC_DATE between (TO_DATE('20/06/2020', 'DD/MM/YYYY') - 35)
AND TO_DATE('21/06/2020', 'DD/MM/YYYY') - INTERVAL '1' SECOND
您可以将谓词修改为可修饰的(可以使用索引),而不是构建基于函数的索引。而不是使用TRUNC
从列中减去,而是在上限文字上加上一天减去一秒。
代码更加混乱,但是应该能够利用索引。但是,35天的数据可能很大。日期索引可能不是很有用,您可能需要查看其他谓词。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句