Как я могу сократить время, настраивая Oracle SQL? - PullRequest
0 голосов
/ 31 декабря 2018
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

1 Ответ

0 голосов
/ 31 декабря 2018

Я бы предложил написать запрос следующим образом:

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, чтобы константы даты не зависели от настроек локальности.
  • Псевдонимы таблиц и полные имена столбцов также должны бытьиспользуется в запросах, имеющих более одной ссылки на таблицу.
...