【问题标题】:What we can add to make Query Run faster in Oracle ? Below is Oracle Query slowness我们可以添加什么来使 Oracle 中的查询运行更快?下面是 Oracle 查询缓慢
【发布时间】:2021-07-09 05:41:00
【问题描述】:
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

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

【问题讨论】:

  • 嗨齐亚德。能否请您发布带有对象名称和访问方法的完整解释计划?
  • 在没有在任何地方使用的情况下包含表 CARDTABLE 的目的是什么?
  • CARDTABLE 上的连接看起来不需要。除非您需要它来排除 TRN.CARDID 无效的记录?
  • 请使用/*+GATHER_PLAN_STATISTICS*/ 提示执行您的查询,并粘贴来自select * from table(dbms_xplan.display_cursor(format => 'BASIC +PREDICATE ALLSTATS LAST')) 的文本输出,该输出应在您的查询之后执行。
  • @NickW 在 CARDTABLE 上有一个连接,完成交易的卡是否有效

标签: sql oracle oracle11g oracle-sqldeveloper


【解决方案1】:
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)

【讨论】:

  • 是的,我已经应用了多列索引。但查询运行时间差别不大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2014-05-03
  • 2023-03-31
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多