sql - 我如何优化这个 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';
谢谢
解决方案
首先,我将对其进行重写,以便该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)
。
推荐阅读
- c++ - 有没有更简单的方法:if(num1 > num2 && num1 > num3),以获得更大的变量列表进行比较?
- python - 当图像是表格时,是否可以更改图像的部分背景颜色?
- excel - 如果存在则更新,否则插入
- ios - 如何在ios中以编程方式从后台删除应用程序
- c++ - 在 C++ 中,您可以像比较类型一样比较模板吗?
- javascript - SyntaxError:带有 mocha 和 babel 的意外标识符
- linux - 在特定位置获取单词后的文本
- php - 用户创建给了我不正确的 ID 值
- java - 找不到调用两个点到一个方法的麻烦。“Java - 距离点”
- python-3.x - python 上的辛普森集成