首页 > 解决方案 > 我们可以添加什么来使 Oracle 中的查询运行更快?下面是 Oracle 查询缓慢

问题描述

SELECT NVL(SUM(TRN.ACCRUALPTS), 0) AS ACCRUALPTS
  FROM TrsanctionTable REQ INNER JOIN 
       TRSANCTIONTABLEREQ TRN ON TRN.TRNREQID = REQ.TRNREQID INNER JOIN 
       CARDTABLE CARD ON CARD.CARDID = TRN.CARDID
 WHERE TRN.CUSTOMERID = 4082
   AND TRN.STATUSCODE = '2220'
   AND REQ.STATUSCODE = '00'
   AND TRN.BATCHID IS NULL;

以上查询需要很长时间才能执行,您能否建议我如何重写或更改此查询以更快地运行。我的团队建议在此查询上添加复合索引。

他们还有什么其他方法可以降低此 QUERY 的成本吗

此查询的成本为 102K

注意:索引已应用于单列。

在此处输入图像描述

在此处输入图像描述

标签: sqloracleoracle11goracle-sqldeveloper

解决方案


SELECT NVL(SUM(TRN.ACCRUALPTS), 0) AS ACCRUALPTS
FROM TrsanctionTable REQ INNER JOIN 
     TRSANCTIONTABLEREQ TRN 
     ON TRN.TRNREQID = REQ.TRNREQID INNER JOIN 
     CARDTABLE CARD
     ON CARD.CARDID = TRN.CARDID
 WHERE TRN.CUSTOMERID = 4082 AND
       TRN.STATUSCODE = '2220' AND
       REQ.STATUSCODE = '00' AND
       TRN.BATCHID IS NULL;

多列索引肯定会有所帮助。如果不知道表格的大小以及如何选择过滤器,就不是 100% 清楚最好的方法是什么。但我猜这会有很大帮助:

  • TRSANCTIONTABLEREQ(CUSTOMERID, STATUSCODE, BATCHID, STATUSCODE, ACCRUALPTS)
  • TrsanctionTable(TRNREQID, STATUSCODE, CARDID)
  • CARDTABLE(CARDID)

推荐阅读