查询花费了太多时间来执行

时间:2016-06-27 10:37:02

标签: oracle

我有这个查询需要大约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有数百万的记录它。我没有选择将视图作为物化视图。

1 个答案:

答案 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 )