Как настроить не в запросе - PullRequest
0 голосов
/ 11 марта 2019

Пожалуйста, настройте мой запрос. Это заняло 17 секунд для выполнения

  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

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я рекомендую написать это, используя NOT EXISTS:

    SELECT m.grirno, m.grirdate
    FROM grirmain m
    WHERE NOT EXISTS (SELECT 1
                      FROM grir_pass p
                      WHERE g.grirno = p.grirno AND
                            p.ins_check IS NOT NULL AND
                            p.grirdate > DATE '2018-04-01'
                      ) AND
          m.grirno IS NOT NULL AND
          m.chkuser IS NOT NULL AND
          m.grirdate > DATE '2018-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(grirno, grirdate, chkuser).

0 голосов
/ 11 марта 2019

Ваш подзапрос фактически выглядит как не , соотнесенный с внешним запросом.Таким образом, Oracle, скорее всего, выполнит его один раз и кеширует результаты для последующего использования.Я могу предложить следующий индекс:

CREATE INDEX idx ON grirmain (gridate, girano, chksuer);

Этот индекс должен, по крайней мере, позволить Oracle быстро обработать предложение WHERE и, кроме того, он охватывает два столбца в предложении SELECT.Как уже упоминалось, некоррелированный подзапрос должен быть выполнен один раз, а затем кэширован.

Что касается предложения ORDER BY, индекс, вероятно, не поможет, и Oracle придется вручную сортировать.

...