我有这个查询需要大约11-12小时才能执行:
SELECT A.EVENT_DATE SENT_DATE
,A.TRANSACTION_CODE EVENT_CODE
,COUNT(a.transaction_id) COUNT
FROM customer A
WHERE A.REQUEST_DATE >= (select max(RUNPERIODFROM_DATE) from auditeventbatch where auditevent_code = 'CDPE')
AND A.TRANSACTION_STATUS = 'STC'
AND NOT EXISTS
(SELECT /*use_nl(a b)*/1 FROM EVENTS_V1 B
WHERE B.TRANSACTIONID=a.transaction_id
AND TRUNC(B.EVENT_DATE) = A.CCE_EVENT_DATE
AND B.TRANSACTION_STATUS='STC'
)
GROUP BY A.CCE_EVENT_DATE
,A.TRANSACTION_CODE
有没有什么方法可以重写这个来减少这个的执行时间。视图CDS_EVENTS_V1有数百万的记录它。我没有选择将视图作为物化视图。
答案 0 :(得分:1)
嗯,其中一个问题是这一行:
AND TRUNC(B.CCE_EVENT_DATE) = A.CCE_EVENT_DATE
TRUNC
使优化器忽略索引(如果存在,如果不存在 - 添加它)。我建议添加另一个包含trunced值的列,并按该列进行比较。
此外,如果不存在,请添加以下索引:
CDS_EVENTS_V1 (transactionid,CCE_EVENT_DATE,TRANSACTION_STATUS)
cds_auditeventbatch (RUNPERIODFROM_DATE,auditevent_code )