Я бы предложил написать запрос следующим образом:
select m.grirno, m.grirdate
from grirmain m
where not exists (select 1
from grir_pass p
where p.ins_check is not null and
p.grirdate > date '2013-04-01' and
p.grirno = m.grirno
) and
m.grirno is not null and
m.chkuser is not null and
m.grirdate > '2013-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(grirdate, chkuser, grirno)
может помочь, но это маловероятно - ваш диапазон дат довольно широк.
Примечания:
not in
не делает то, что вы ожидаете, еслиподзапрос возвращает любые значения NULL
.Следовательно, not exists
настоятельно рекомендуется. - Научитесь использовать ключевое слово
date
, чтобы константы даты не зависели от настроек локальности. - Псевдонимы таблиц и полные имена столбцов также должны бытьиспользуется в запросах, имеющих более одной ссылки на таблицу.