【发布时间】:2020-06-26 17:54:55
【问题描述】:
我正在使用 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;
谢谢。
【问题讨论】:
-
提供样本数据、期望的结果以及您想要完成的任务的说明。
-
您正在处理一个多月的数据。我认为这是针对每晚/批处理,而不是针对交互式用户。当前执行时间是多少?您的目标执行时间是多少?
-
order by max(ids) desc在查询中无效。你应该删除它。 -
SELECT functions.decrypt(t.card_number) FROM DUAL可以只替换为functions.decrypt(t.card_number) -
@TheImpaler 很遗憾它是为用户服务的,是的,它正在搜索过去 35 天,客户告诉我他们每天处理大约 90.000 条记录,所以在那个月他们获得了超过 300 万条记录,我将按 max(ids) 删除订单