Search code examples
sqloracleoracle10gquery-optimization

How to tune not in query


Please tune my query.It took 17 sec for execution

  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

Solution

  • I recommend writing this using 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;
    

    Then, you want indexes on grir_pass(grirno, grirdate, ins_check) and grirmain(grirno, grirdate, chkuser).