Как сократить время, настроив Oracle SQL?

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

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

Jonathan Leffler 31.12.2018 07:30

См. Также Как опубликовать вопрос T-SQL на публичном форуме - хотя T-SQL не является Oracle, принципы те же.

Jonathan Leffler 31.12.2018 07:34

Оптимизация запросов сложна, потому что очень многое зависит от специфики каждого случая. Увы, мы не можем просто посмотреть на ваш запрос и сказать, как его ускорить. Пожалуйста, прочтите этот пост на StackOverflow, в котором описывается дополнительная информация, которая нам нужна, прежде чем мы сможем помочь, и как вы ее получите.

APC 31.12.2018 09:16

В вашем запросе слишком много NOT, и один или несколько из них наверняка вызывают полное сканирование таблицы. Вероятно, есть способ удалить большинство из них, заменив ваш NOT IN на LEFT JOIN между двумя таблицами. Однако невозможно дать правильную инструкцию с тем, что вы показали. Нам нужна структура таблицы и данные.

Thomas G 31.12.2018 09:41
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
4
42
1

Ответы 1

Я бы предложил написать запрос как:

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

Другие вопросы по теме

Похожие вопросы

Как исправить: сообщение привязки предоставляет 3 параметра, но для подготовленного оператора "" требуется 2, ошибка в сокращении?
Как исправить ошибку: «Указанный член типа не поддерживается в LINQ to Entities ...» в несопоставленных столбцах
PHP, JOIN и Laravel - Как разделять массивы при объединении таблицы
Недопустимая внешняя процедура при использовании кнопки поиска в Access
Группировать по строкам, где значение равно 0 или несуществующим строкам в MySQL?
Как избежать курсора и цикла в PL / SQL для получения данных в переменной с новой строки?
Группировать дубликаты на основе условия в SQL Server
Правильный синтаксис соединения для соединения только тех строк из таблицы A, которые соответствуют таблице B
Выберите самое позднее и самое раннее время в пределах временной группы и сводной таблицы
Количество дублированных данных на исходную дату