select grirno,grirdate
from grirmain
where grirno not in
(select grirno
from grir_pass
where ins_check is not null
and grirdate > '01-apr-2013'
)
and grirno is not null
and chkuser is not null
and grirdate >'01-apr-2013'
order by to_number(substr(GRIRNO,instr(GRIRNO,'/',1,1)+1,(instr(GRIRNO,'/',1,2)-instr(GRIRNO,'/',1,1)-1))) desc
См. Также Как опубликовать вопрос T-SQL на публичном форуме - хотя T-SQL не является Oracle, принципы те же.
Оптимизация запросов сложна, потому что очень многое зависит от специфики каждого случая. Увы, мы не можем просто посмотреть на ваш запрос и сказать, как его ускорить. Пожалуйста, прочтите этот пост на StackOverflow, в котором описывается дополнительная информация, которая нам нужна, прежде чем мы сможем помочь, и как вы ее получите.
В вашем запросе слишком много NOT, и один или несколько из них наверняка вызывают полное сканирование таблицы. Вероятно, есть способ удалить большинство из них, заменив ваш NOT IN на LEFT JOIN между двумя таблицами. Однако невозможно дать правильную инструкцию с тем, что вы показали. Нам нужна структура таблицы и данные.


Я бы предложил написать запрос как:
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, чтобы константы даты не зависели от настроек местности.
Добро пожаловать в Stack Overflow. Пожалуйста, прочтите страницы О и Как спросить в ближайшее время. Когда вы задаете вопрос SQL, пожалуйста, добавьте тег для обозначения диалекта SQL - в данном случае Oracle. Для вопросов SQL вам обычно необходимо предоставить общую схему таблиц, некоторые образцы данных и результаты, которые вы получаете и ожидаете от образцов данных. К сожалению, этот вопрос более сложный; нам нужна информация о размерах таблиц (количество строк; размер каждой строки - круглые числа в порядке) и индексы, которые есть в таблицах. Вероятно, он слишком открытый, и на него будет сложно дать хороший ответ.