首页 > 解决方案 > 我如何优化这个 oracle 查询?

问题描述

我正在使用 oracle 11g,我们遇到了一个问题,这个查询需要永远执行,主表 tbl_inc 有大约 1700 万条记录,有什么办法可以改进这个查询吗?我不能添加索引,我没有权限。

SELECT count(*) FROM TBL_INC INC LEFT JOIN TBL_PDS P ON INC.SID = P.TRX
INNER JOIN TBL_ASTS ASTS ON ASTS.CODE = INC.CODE AND ASTS.MIT 
= INC.MIT AND ASTS.OPE_PROD = 3
WHERE (INC.INC_DATE -1) >= to_date('29/10/20', 'DD/MM/YY')
AND INC.INC_DATE - 1  <= to_date('05/11/20', 'DD/MM/YY')
AND INC.OPE = 50 AND SUBSTR(INC.CARD_NMBR, 1, 6) = 123456 
AND INC.MIT='05' AND INC.CODE='00';

谢谢

标签: sqloracle

解决方案


首先,我将对其进行重写,以便该where子句在列上没有表达式:

SELECT count(*)
FROM TBL_INC INC LEFT JOIN
     TBL_PDS P
     ON INC.SID = P.TRX INNER JOIN
     TBL_ASTS ASTS
     ON ASTS.CODE = INC.CODE AND
        ASTS.MIT = INC.MIT AND
        ASTS.OPE_PROD = 3
WHERE INC.INC_DATE >= to_date('29/10/20', 'DD/MM/YY') + interval '1 day' AND
AND INC.INC_DATE - 1  <= to_date('05/11/20', 'DD/MM/YY') + interval '1 day' AND
      INC.OPE = 50 AND
      INC.CARD_NMBR  LIKE '123456%' AND
      INC.MIT = '05' AND INC.CODE = '00';

然后对于这个查询,你需要一个索引: TBL_INC(MIT, CODE, OPE, INC_DATE, CARD_NMBR)。我猜你JOIN在其他表中使用的键上有索引,但那些是TBL_PDS(TRX)and TBL_ASTS(CODE< MIT, OPE_PROD)


推荐阅读