请调整我的查询。执行时间为17秒
选择grirno,grirdate 来自grirmain 格林诺不在 (选择格里诺 来自grir_pass …
我建议用这个写 NOT EXISTS :
NOT EXISTS
SELECT m.grirno, m.grirdate FROM grirmain m WHERE NOT EXISTS (SELECT 1 FROM grir_pass p WHERE g.grirno = p.grirno AND p.ins_check IS NOT NULL AND p.grirdate > DATE '2018-04-01' ) AND m.grirno IS NOT NULL AND m.chkuser IS NOT NULL AND m.grirdate > DATE '2018-04-01' ORDER BY TO_NUMBER(SUBSTR (GRIRNO,INSTR (GRIRNO,'/',1,1)+ 1,( INSTR (GRIRNO,'/',1,2)- INSTR (GRIRNO,'/',1,1)- 1))) DESC;
然后,你想要索引 grir_pass(grirno, grirdate, ins_check) 和 grirmain(grirno, grirdate, chkuser) 。
grir_pass(grirno, grirdate, ins_check)
grirmain(grirno, grirdate, chkuser)
您的子查询实际上似乎是完全的 非 与外部查询相关联。因此,Oracle很可能会执行一次并缓存稍后要使用的结果。我可以建议以下索引:
CREATE INDEX idx ON grirmain (gridate, girano, chksuer);
这个索引至少应该让Oracle处理 WHERE 条款很快,另外它涵盖了两列 SELECT 条款。如上所述,不相关的子查询应该执行一次然后缓存。
WHERE
SELECT
至于 ORDER BY 该子句,索引可能无济于事,Oracle必须手动排序。
ORDER BY