Я думаю, что вы можете использовать MINUS
вместо NOT IN
для увеличения производительности в большинстве ситуаций:
SELECT *
FROM
(
SELECT GRIRNO, GRIRDATE, CLRD_ON
FROM GRIR_PASS
WHERE APRVD_BY IS NOT NULL
MINUS
SELECT GRIRNO, GRIRDATE, CLRD_ON
FROM GRIR_PASS
WHERE grirno in (select grirno from grirmain where rcvd_by is not null)
)
ORDER BY TO_NUMBER(substr(GRIRNO,
instr(GRIRNO, '/', 1, 1) + 1,
(instr(GRIRNO, '/', 1, 2) -
instr(GRIRNO, '/', 1, 1) - 1)));