• 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例


    背景

    今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化。

    优化前:
    耗时:503s
    返回:0

    SQL代码

    SELECT *
      FROM MM_PAYABLEMONEY_TD P
     WHERE P.DATATYPE IN ('132',
                          '304',
                          '313',
                          '316',
                          '323',
                          '321',
                          '330',
                          '334',
                          '338',
                          '342',
                          '346',
                          '350',
                          '351',
                          '353',
                          '355',
                          '358',
                          '359',
                          '362',
                          '365',
                          '364',
                          '516',
                          '518',
                          '524',
                          '528',
                          '532',
                          '535',
                          '538',
                          '539',
                          '542',
                          'Y32',
                          'C04',
                          'C70',
                          'C30',
                          'C74',
                          'C53',
                          'C55',
                          'C76',
                          'C58',
                          'C79',
                          'C59',
                          'C80',
                          'C62',
                          'C83',
                          'C65',
                          'C64',
                          'F16',
                          'F18',
                          'F24',
                          'F28',
                          'F32',
                          'F35',
                          'F38',
                          'F39',
                          'F42',
                          'C30',
                          'C28',
                          'C75',
                          '367',
                          '370')
       AND P.OPSTATUS IN ('0')
       AND P.SUBCOMPANY = '015100'
       AND BASEAMOUNT < BASEUSEDAMOUNT
       AND BASEAMOUNT < 0.00
       AND NOT EXISTS
     (SELECT 1
              FROM MM_INVPLY_TD I
             WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
               AND I.OPSTATUS NOT IN ('3', '4', '5'))      
       AND EXISTS
     (SELECT 'X'
              FROM MM_PAYABLEMONEY_TD
             WHERE POLICYNO = P.POLICYNO
               AND UNITCODE = P.UNITCODE
               AND BASECURRENCYCODE = P.BASECURRENCYCODE
               AND DATATYPE IN ('122',
                                '302',
                                '311',
                                '314',
                                '319',
                                '325',
                                '328',
                                '332',
                                '336',
                                '340',
                                '344',
                                '348',
                                '352',
                                '354',
                                '356',
                                '357',
                                '360',
                                '361',
                                '363',
                                '366',
                                '502',
                                '504',
                                '506',
                                '508',
                                '512',
                                '514',
                                '522',
                                '526',
                                '534',
                                '536',
                                '537',
                                '540',
                                '541',
                                'Y22',
                                'C02',
                                'C68',
                                'C28',
                                'C72',
                                'C54',
                                'C56',
                                'C77',
                                'C57',
                                'C78',
                                'C60',
                                'C81',
                                'C61',
                                'C82',
                                'C63',
                                'C66',
                                'F02',
                                'F04',
                                'F06',
                                'F08',
                                'F12',
                                'F14',
                                'F22',
                                'F26',
                                'F34',
                                'F36',
                                'F37',
                                'F40',
                                'F41',
                                'C30',
                                'C28',
                                'C75',
                                '367',
                                '370')
               AND NOT EXISTS
             (SELECT 1
                      FROM MM_INVPLY_TD I
                     WHERE (I.SEQPOLICY = P.FATHERNO OR
                           I.VATSEQPOLICY = P.FATHERNO)
                       AND I.OPSTATUS NOT IN ('3', '4', '5'))
               AND OPSTATUS IN ('0')
               AND ((CUSTSEQ = P.OFFSETNO AND P.OFFSETNO IS NOT NULL) OR
                   (OFFSETNO = P.CUSTSEQ AND P.OFFSETNO IS NULL))
               AND AMOUNT = -P.AMOUNT
               AND TRIM(CUSTOMERCODE) = TRIM(P.CUSTOMERCODE)
               AND BASEAMOUNT > 0.00)
       AND NOT EXISTS
     (SELECT 1
              FROM MM_BATCHINFO_TD
             WHERE POLICYNO = P.POLICYNO
               AND OPSTATUS <> '3'
               AND ((SERIALNO = P.CUSTSEQ) OR
                   (SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
       AND NOT EXISTS
     (SELECT 1
              FROM MM_BATCHINFO_TI
             WHERE POLICYNO = P.POLICYNO
               AND STATUS <> '4'
               AND ((SERIALNO = P.CUSTSEQ) OR
                   (SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
       AND NOT EXISTS (SELECT 1
              FROM MM_POLICY_EVENTS_TD2 E2, MM_APPLYFEE_TD A
             WHERE E2.FATHERNO = A.SEQFEELIST
               AND E2.FATHERNO = P.FATHERNO)

    SQL执行计划

    
    Plan hash value: 3405241672
    
    -----------------------------------------------------------------------------------------------------------
    | Id  | Operation                          | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                   |                      |     1 |   884 |  1064K  (1)| 03:33:00 |
    |   1 |  FOR UPDATE                        |                      |       |       |            |          |
    |*  2 |   FILTER                           |                      |       |       |            |          |
    |*  3 |    HASH JOIN ANTI                  |                      |   124 |   107K|  1952   (3)| 00:00:24 |
    |*  4 |     TABLE ACCESS BY INDEX ROWID    | MM_PAYABLEMONEY_TD   |   146 |   124K|  1601   (2)| 00:00:20 |
    |*  5 |      INDEX RANGE SCAN              | IDX_PAYABLEMONEY_02  |   199 |       |  1438   (3)| 00:00:18 |
    |   6 |     VIEW                           | VW_SQ_1              | 12620 |   160K|   350   (3)| 00:00:05 |
    |*  7 |      HASH JOIN                     |                      | 12620 |   172K|   350   (3)| 00:00:05 |
    |   8 |       TABLE ACCESS FULL            | MM_POLICY_EVENTS_TD2 | 12620 | 88340 |   166   (1)| 00:00:02 |
    |   9 |       INDEX FAST FULL SCAN         | SYS_C00139261        |   372K|  2544K|   180   (3)| 00:00:03 |
    |* 10 |    TABLE ACCESS FULL               | MM_INVPLY_TD         |     3 |    45 |  1147   (2)| 00:00:14 |
    |* 11 |     FILTER                         |                      |       |       |            |          |
    |* 12 |      TABLE ACCESS BY INDEX ROWID   | MM_PAYABLEMONEY_TD   |     1 |    89 |     7   (0)| 00:00:01 |
    |* 13 |       INDEX RANGE SCAN             | IDX_PAYABLEMONEY_04  |     8 |       |     3   (0)| 00:00:01 |
    |* 14 |      TABLE ACCESS FULL             | MM_INVPLY_TD         |     3 |    45 |  1147   (2)| 00:00:14 |
    |  15 |       CONCATENATION                |                      |       |       |            |          |
    |* 16 |        FILTER                      |                      |       |       |            |          |
    |* 17 |         TABLE ACCESS BY INDEX ROWID| MM_BATCHINFO_TD      |     1 |    48 |  1758   (1)| 00:00:22 |
    |* 18 |          INDEX SKIP SCAN           | IDX_BATCHINFO_TD3    |     2 |       |  1756   (1)| 00:00:22 |
    |* 19 |        TABLE ACCESS BY INDEX ROWID | MM_BATCHINFO_TD      |     1 |    48 |  1758   (1)| 00:00:22 |
    |* 20 |         INDEX SKIP SCAN            | IDX_BATCHINFO_TD3    |     2 |       |  1756   (1)| 00:00:22 |
    |* 21 |         TABLE ACCESS FULL          | MM_BATCHINFO_TI      |     1 |    48 | 11305   (1)| 00:02:16 |
    -----------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B1 
                  OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4') 
                  AND  EXISTS (SELECT /*+ */ 0 FROM "MM_PAYABLEMONEY_TD" "MM_PAYABLEMONEY_TD" WHERE  NOT EXISTS 
                  (SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B3 OR "I"."SEQPOLICY"=:B4) AND 
                  "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4') AND "POLICYNO"=:B5 AND (:B6 
                  IS NULL AND "OFFSETNO"=:B7 OR :B8 IS NOT NULL AND "CUSTSEQ"=:B9) AND "BASECURRENCYCODE"=:B10 AND 
                  "UNITCODE"=:B11 AND "AMOUNT"=(-:B12) AND "OPSTATUS"='0' AND "BASEAMOUNT">0.00 AND 
                  TRIM("CUSTOMERCODE")=TRIM(:B13) AND ("DATATYPE"='122' OR "DATATYPE"='302' OR "DATATYPE"='311' OR 
                  "DATATYPE"='314' OR "DATATYPE"='319' OR "DATATYPE"='325' OR "DATATYPE"='328' OR "DATATYPE"='332' 
                  OR "DATATYPE"='336' OR "DATATYPE"='340' OR "DATATYPE"='344' OR "DATATYPE"='348' OR 
                  "DATATYPE"='352' OR "DATATYPE"='354' OR "DATATYPE"='356' OR "DATATYPE"='357' OR "DATATYPE"='360' 
                  OR "DATATYPE"='361' OR "DATATYPE"='363' OR "DATATYPE"='366' OR "DATATYPE"='367' OR 
                  "DATATYPE"='370' OR "DATATYPE"='502' OR "DATATYPE"='504' OR "DATATYPE"='506' OR "DATATYPE"='508' 
                  OR "DATATYPE"='512' OR "DATATYPE"='514' OR "DATATYPE"='522' OR "DATATYPE"='526' OR 
                  "DATATYPE"='534' OR "DATATYPE"='536' OR "DATATYPE"='537' OR "DATATYPE"='540' OR "DATATYPE"='541' 
                  OR "DATATYPE"='C02' OR "DATATYPE"='C28' OR "DATATYPE"='C30' OR "DATATYPE"='C54' OR 
                  "DATATYPE"='C56' OR "DATATYPE"='C57' OR "DATATYPE"='C60' OR "DATATYPE"='C61' OR "DATATYPE"='C63' 
                  OR "DATATYPE"='C66' OR "DATATYPE"='C68' OR "DATATYPE"='C72' OR "DATATYPE"='C75' OR 
                  "DATATYPE"='C77' OR "DATATYPE"='C78' OR "DATATYPE"='C81' OR "DATATYPE"='C82' OR "DATATYPE"='F02' 
                  OR "DATATYPE"='F04' OR "DATATYPE"='F06' OR "DATATYPE"='F08' OR "DATATYPE"='F12' OR 
                  "DATATYPE"='F14' OR "DATATYPE"='F22' OR "DATATYPE"='F26' OR "DATATYPE"='F34' OR "DATATYPE"='F36' 
                  OR "DATATYPE"='F37' OR "DATATYPE"='F40' OR "DATATYPE"='F41' OR "DATATYPE"='Y22')) AND  NOT EXISTS 
                  (SELECT /*+ */ 0 FROM "MM_BATCHINFO_TD" "MM_BATCHINFO_TD"???)
       3 - access("FATHERNO"="P"."FATHERNO")
       4 - filter("BASEAMOUNT"<"BASEUSEDAMOUNT")
       5 - access("P"."SUBCOMPANY"=:B1 AND "P"."OPSTATUS"='0' AND "BASEAMOUNT"<0.00)
           filter("BASEAMOUNT"<0.00 AND "P"."OPSTATUS"='0' AND ("P"."DATATYPE"='132' OR 
                  "P"."DATATYPE"='304' OR "P"."DATATYPE"='313' OR "P"."DATATYPE"='316' OR "P"."DATATYPE"='321' OR 
                  "P"."DATATYPE"='323' OR "P"."DATATYPE"='330' OR "P"."DATATYPE"='334' OR "P"."DATATYPE"='338' OR 
                  "P"."DATATYPE"='342' OR "P"."DATATYPE"='346' OR "P"."DATATYPE"='350' OR "P"."DATATYPE"='351' OR 
                  "P"."DATATYPE"='353' OR "P"."DATATYPE"='355' OR "P"."DATATYPE"='358' OR "P"."DATATYPE"='359' OR 
                  "P"."DATATYPE"='362' OR "P"."DATATYPE"='364' OR "P"."DATATYPE"='365' OR "P"."DATATYPE"='367' OR 
                  "P"."DATATYPE"='370' OR "P"."DATATYPE"='516' OR "P"."DATATYPE"='518' OR "P"."DATATYPE"='524' OR 
                  "P"."DATATYPE"='528' OR "P"."DATATYPE"='532' OR "P"."DATATYPE"='535' OR "P"."DATATYPE"='538' OR 
                  "P"."DATATYPE"='539' OR "P"."DATATYPE"='542' OR "P"."DATATYPE"='C04' OR "P"."DATATYPE"='C28' OR 
                  "P"."DATATYPE"='C30' OR "P"."DATATYPE"='C53' OR "P"."DATATYPE"='C55' OR "P"."DATATYPE"='C58' OR 
                  "P"."DATATYPE"='C59' OR "P"."DATATYPE"='C62' OR "P"."DATATYPE"='C64' OR "P"."DATATYPE"='C65' OR 
                  "P"."DATATYPE"='C70' OR "P"."DATATYPE"='C74' OR "P"."DATATYPE"='C75' OR "P"."DATATYPE"='C76' OR 
                  "P"."DATATYPE"='C79' OR "P"."DATATYPE"='C80' OR "P"."DATATYPE"='C83' OR "P"."DATATYPE"='F16' OR 
                  "P"."DATATYPE"='F18' OR "P"."DATATYPE"='F24' OR "P"."DATATYPE"='F28' OR "P"."DATATYPE"='F32' OR 
                  "P"."DATATYPE"='F35' OR "P"."DATATYPE"='F38' OR "P"."DATATYPE"='F39' OR "P"."DATATYPE"='F42' OR 
                  "P"."DATATYPE"='Y32'))
       7 - access("E2"."FATHERNO"="A"."SEQFEELIST")
      10 - filter(("I"."VATSEQPOLICY"=:B1 OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND 
                  "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
      11 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B1 
                  OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4'))
      12 - filter((:B1 IS NULL AND "OFFSETNO"=:B2 OR :B3 IS NOT NULL AND "CUSTSEQ"=:B4) AND 
                  "BASECURRENCYCODE"=:B5 AND "UNITCODE"=:B6 AND "AMOUNT"=(-:B7) AND "OPSTATUS"='0' AND 
                  "BASEAMOUNT">0.00 AND TRIM("CUSTOMERCODE")=TRIM(:B8) AND ("DATATYPE"='122' OR "DATATYPE"='302' OR 
                  "DATATYPE"='311' OR "DATATYPE"='314' OR "DATATYPE"='319' OR "DATATYPE"='325' OR "DATATYPE"='328' 
                  OR "DATATYPE"='332' OR "DATATYPE"='336' OR "DATATYPE"='340' OR "DATATYPE"='344' OR 
                  "DATATYPE"='348' OR "DATATYPE"='352' OR "DATATYPE"='354' OR "DATATYPE"='356' OR "DATATYPE"='357' 
                  OR "DATATYPE"='360' OR "DATATYPE"='361' OR "DATATYPE"='363' OR "DATATYPE"='366' OR 
                  "DATATYPE"='367' OR "DATATYPE"='370' OR "DATATYPE"='502' OR "DATATYPE"='504' OR "DATATYPE"='506' 
                  OR "DATATYPE"='508' OR "DATATYPE"='512' OR "DATATYPE"='514' OR "DATATYPE"='522' OR 
                  "DATATYPE"='526' OR "DATATYPE"='534' OR "DATATYPE"='536' OR "DATATYPE"='537' OR "DATATYPE"='540' 
                  OR "DATATYPE"='541' OR "DATATYPE"='C02' OR "DATATYPE"='C28' OR "DATATYPE"='C30' OR 
                  "DATATYPE"='C54' OR "DATATYPE"='C56' OR "DATATYPE"='C57' OR "DATATYPE"='C60' OR "DATATYPE"='C61' 
                  OR "DATATYPE"='C63' OR "DATATYPE"='C66' OR "DATATYPE"='C68' OR "DATATYPE"='C72' OR 
                  "DATATYPE"='C75' OR "DATATYPE"='C77' OR "DATATYPE"='C78' OR "DATATYPE"='C81' OR "DATATYPE"='C82' 
                  OR "DATATYPE"='F02' OR "DATATYPE"='F04' OR "DATATYPE"='F06' OR "DATATYPE"='F08' OR 
                  "DATATYPE"='F12' OR "DATATYPE"='F14' OR "DATATYPE"='F22' OR "DATATYPE"='F26' OR "DATATYPE"='F34' 
                  OR "DATATYPE"='F36' OR "DATATYPE"='F37' OR "DATATYPE"='F40' OR "DATATYPE"='F41' OR 
                  "DATATYPE"='Y22'))
      13 - access("POLICYNO"=:B1)
      14 - filter(("I"."VATSEQPOLICY"=:B1 OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND 
                  "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
      16 - filter(:B1 IS NOT NULL)
      17 - filter("POLICYNO"=:B1 AND "OPSTATUS"<>'3')
      18 - access("SERIALNO"=:B1)
           filter("SERIALNO"=:B1)
      19 - filter("POLICYNO"=:B1 AND "OPSTATUS"<>'3' AND (LNNVL(:B2 IS NOT NULL) OR 
                  LNNVL("SERIALNO"=:B3)))
      20 - access("SERIALNO"=:B1)
           filter("SERIALNO"=:B1)
      21 - filter("POLICYNO"=:B1 AND ("SERIALNO"=:B2 OR :B3 IS NOT NULL AND "SERIALNO"=:B4) AND 
                  "STATUS"<>'4')
    

    分析

    1) 从执行计划 ID=2 与 ID =11中可以看出,该SQL中有filte关键字,filte的驱动表是固定的,一旦驱动表固定,
    那么执行计划也就被固定了,一旦被固定的执行计划本身是错误的(低效的),就会引起性能问题。
    
    2)ID=2 filte的两个子级是ID=3(驱动表MM_PAYABLEMONEY_TD)与ID=10(被驱动表MM_INVPLY_TD), 
    ID=10 为TABLE ACCESS FULL。所以可以在MM_INVPLY_TD表上建立索引。
    create index idx_BATCHINFO_TI_test on MM_BATCHINFO_TI (POLICYNO, SERIALNO, STATUS);
    
    3)ID=18与ID=20 访问表MM_BATCHINFO_TD采用的INDEX SKIP SCAN方式,这种索引扫描方式很低效,
    所以可以在MM_BATCHINFO_TD表上建立索引:
    create index IDX_BATCHINFO_TEST on MM_BATCHINFO_TD (SERIALNO, POLICYNO, OPSTATUS);
    
    4)索引优化后,SQL运行时间缩短至200s
    
    5)逐一对SQL的子查询进行运行分析,得出性能主要慢在:
    
       AND NOT EXISTS
     (SELECT 1
              FROM MM_INVPLY_TD I
             WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
               AND I.OPSTATUS NOT IN ('3', '4', '5'))  
    
    对其进行分析改写:
    
      left join (SELECT SEQPOLICY
                   FROM MM_INVPLY_TD I
                  WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                    AND SEQPOLICY IS NOT NULL
                 union all
                 SELECT VATSEQPOLICY
                   FROM MM_INVPLY_TD I
                  WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                    AND VATSEQPOLICY IS NOT NULL) tp
        on P.FATHERNO = tp.SEQPOLICY
    
    where tp.SEQPOLICY is null
    

    优化

    1)建立索引

    create index idx_BATCHINFO_TI_test on MM_BATCHINFO_TI (POLICYNO, SERIALNO, STATUS);
    
    create index IDX_BATCHINFO_TEST on MM_BATCHINFO_TD (SERIALNO, POLICYNO, OPSTATUS);

    2)改写SQL语句

    SELECT *
      FROM MM_PAYABLEMONEY_TD P
      LEFT JOIN (SELECT SEQPOLICY
                   FROM MM_INVPLY_TD I
                  WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                    AND SEQPOLICY IS NOT NULL
                 UNION ALL
                 SELECT VATSEQPOLICY
                   FROM MM_INVPLY_TD I
                  WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                    AND VATSEQPOLICY IS NOT NULL) TP
        ON P.FATHERNO = TP.SEQPOLICY
     WHERE P.DATATYPE IN ('132',
                          '304',
                          '313',
                          '316',
                          '323',
                          '321',
                          '330',
                          '334',
                          '338',
                          '342',
                          '346',
                          '350',
                          '351',
                          '353',
                          '355',
                          '358',
                          '359',
                          '362',
                          '365',
                          '364',
                          '516',
                          '518',
                          '524',
                          '528',
                          '532',
                          '535',
                          '538',
                          '539',
                          '542',
                          'Y32',
                          'C04',
                          'C70',
                          'C30',
                          'C74',
                          'C53',
                          'C55',
                          'C76',
                          'C58',
                          'C79',
                          'C59',
                          'C80',
                          'C62',
                          'C83',
                          'C65',
                          'C64',
                          'F16',
                          'F18',
                          'F24',
                          'F28',
                          'F32',
                          'F35',
                          'F38',
                          'F39',
                          'F42',
                          'C30',
                          'C28',
                          'C75',
                          '367',
                          '370')
       AND P.OPSTATUS IN ('0')
       AND P.SUBCOMPANY = '015100'
       AND BASEAMOUNT < BASEUSEDAMOUNT
       AND BASEAMOUNT < 0.00
       AND TP.SEQPOLICY IS NULL
          /*   AND NOT EXISTS
          (SELECT 1
                   FROM MM_INVPLY_TD I
                  WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
                    AND I.OPSTATUS NOT IN ('3', '4', '5'))  */
       AND EXISTS
     (SELECT 'X'
              FROM MM_PAYABLEMONEY_TD
              LEFT JOIN (SELECT SEQPOLICY
                          FROM MM_INVPLY_TD I
                         WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                           AND SEQPOLICY IS NOT NULL
                        UNION ALL
                        SELECT VATSEQPOLICY
                          FROM MM_INVPLY_TD I
                         WHERE I.OPSTATUS NOT IN ('3', '4', '5')
                           AND VATSEQPOLICY IS NOT NULL) TD
                ON FATHERNO = TD.SEQPOLICY
             WHERE POLICYNO = P.POLICYNO
               AND UNITCODE = P.UNITCODE
               AND BASECURRENCYCODE = P.BASECURRENCYCODE
               AND DATATYPE IN ('122',
                                '302',
                                '311',
                                '314',
                                '319',
                                '325',
                                '328',
                                '332',
                                '336',
                                '340',
                                '344',
                                '348',
                                '352',
                                '354',
                                '356',
                                '357',
                                '360',
                                '361',
                                '363',
                                '366',
                                '502',
                                '504',
                                '506',
                                '508',
                                '512',
                                '514',
                                '522',
                                '526',
                                '534',
                                '536',
                                '537',
                                '540',
                                '541',
                                'Y22',
                                'C02',
                                'C68',
                                'C28',
                                'C72',
                                'C54',
                                'C56',
                                'C77',
                                'C57',
                                'C78',
                                'C60',
                                'C81',
                                'C61',
                                'C82',
                                'C63',
                                'C66',
                                'F02',
                                'F04',
                                'F06',
                                'F08',
                                'F12',
                                'F14',
                                'F22',
                                'F26',
                                'F34',
                                'F36',
                                'F37',
                                'F40',
                                'F41',
                                'C30',
                                'C28',
                                'C75',
                                '367',
                                '370')
                  /*           AND NOT EXISTS
                  (SELECT 1
                           FROM MM_INVPLY_TD I
                          WHERE (I.SEQPOLICY = P.FATHERNO OR
                                I.VATSEQPOLICY = P.FATHERNO)
                            AND I.OPSTATUS NOT IN ('3', '4', '5'))*/
               AND TD.SEQPOLICY IS NULL
               AND OPSTATUS IN ('0')
               AND ((CUSTSEQ = P.OFFSETNO AND P.OFFSETNO IS NOT NULL) OR
                   (OFFSETNO = P.CUSTSEQ AND P.OFFSETNO IS NULL))
               AND AMOUNT = -P.AMOUNT
               AND TRIM(CUSTOMERCODE) = TRIM(P.CUSTOMERCODE)
               AND BASEAMOUNT > 0.00)
       AND NOT EXISTS
     (SELECT 1
              FROM MM_BATCHINFO_TD
             WHERE POLICYNO = P.POLICYNO
               AND OPSTATUS <> '3'
               AND ((SERIALNO = P.CUSTSEQ) OR
                   (SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
       AND NOT EXISTS
     (SELECT 1
              FROM MM_BATCHINFO_TI
             WHERE POLICYNO = P.POLICYNO
               AND STATUS <> '4'
               AND ((SERIALNO = P.CUSTSEQ) OR
                   (SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
       AND NOT EXISTS (SELECT 1
              FROM MM_POLICY_EVENTS_TD2 E2, MM_APPLYFEE_TD A
             WHERE E2.FATHERNO = A.SEQFEELIST
               AND E2.FATHERNO = P.FATHERNO)
    
    
    优化后的执行计划:
    
    
    Plan hash value: 783089741
    
    ----------------------------------------------------------------------------------------------------------
    | Id  | Operation                        | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                 |                       |     1 |   897 |   442K  (2)| 01:28:25 |
    |*  1 |  FILTER                          |                       |       |       |            |          |
    |*  2 |   FILTER                         |                       |       |       |            |          |
    |*  3 |    HASH JOIN OUTER               |                       |   170 |   148K|  8528   (2)| 00:01:43 |
    |*  4 |     HASH JOIN ANTI               |                       |   170 |   146K|  2540   (3)| 00:00:31 |
    |*  5 |      TABLE ACCESS BY INDEX ROWID | MM_PAYABLEMONEY_TD    |   200 |   170K|  2189   (2)| 00:00:27 |
    |*  6 |       INDEX RANGE SCAN           | IDX_PAYABLEMONEY_02   |   273 |       |  1966   (3)| 00:00:24 |
    |   7 |      VIEW                        | VW_SQ_1               | 12620 |   160K|   350   (3)| 00:00:05 |
    |*  8 |       HASH JOIN                  |                       | 12620 |   172K|   350   (3)| 00:00:05 |
    |   9 |        TABLE ACCESS FULL         | MM_POLICY_EVENTS_TD2  | 12620 | 88340 |   166   (1)| 00:00:02 |
    |  10 |        INDEX FAST FULL SCAN      | SYS_C00139261         |   372K|  2544K|   180   (3)| 00:00:03 |
    |  11 |     VIEW                         |                       |   536K|  6808K|  5983   (2)| 00:01:12 |
    |  12 |      UNION-ALL                   |                       |       |       |            |          |
    |* 13 |       TABLE ACCESS FULL          | MM_INVPLY_TD          |   437K|  5124K|  2997   (3)| 00:00:36 |
    |* 14 |       TABLE ACCESS FULL          | MM_INVPLY_TD          | 99039 |   773K|  2985   (2)| 00:00:36 |
    |  15 |   CONCATENATION                  |                       |       |       |            |          |
    |* 16 |    FILTER                        |                       |       |       |            |          |
    |* 17 |     INDEX RANGE SCAN             | IDX_BATCHINFO_TEST    |     1 |    48 |     3   (0)| 00:00:01 |
    |* 18 |    INDEX RANGE SCAN              | IDX_BATCHINFO_TEST    |     1 |    48 |     3   (0)| 00:00:01 |
    |* 19 |     INDEX RANGE SCAN             | IDX_BATCHINFO_TI_TEST |     1 |    48 |     3   (0)| 00:00:01 |
    |* 20 |      HASH JOIN ANTI              |                       |     1 |   109 |  5995   (2)| 00:01:12 |
    |* 21 |       TABLE ACCESS BY INDEX ROWID| MM_PAYABLEMONEY_TD    |     1 |    96 |     7   (0)| 00:00:01 |
    |* 22 |        INDEX RANGE SCAN          | IDX_PAYABLEMONEY_04   |     8 |       |     3   (0)| 00:00:01 |
    |  23 |       VIEW                       |                       |   536K|  6808K|  5983   (2)| 00:01:12 |
    |  24 |        UNION-ALL                 |                       |       |       |            |          |
    |* 25 |         TABLE ACCESS FULL        | MM_INVPLY_TD          |   437K|  5124K|  2997   (3)| 00:00:36 |
    |* 26 |         TABLE ACCESS FULL        | MM_INVPLY_TD          | 99039 |   773K|  2985   (2)| 00:00:36 |
    ----------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_BATCHINFO_TD" "MM_BATCHINFO_TD"???)
       2 - filter("TP"."SEQPOLICY" IS NULL)
       3 - access("P"."FATHERNO"="TP"."SEQPOLICY"(+))
       4 - access("FATHERNO"="P"."FATHERNO")
       5 - filter("P"."BASEAMOUNT"<"P"."BASEUSEDAMOUNT")
       6 - access("P"."SUBCOMPANY"='015100' AND "P"."OPSTATUS"='0' AND "P"."BASEAMOUNT"<0.00)
           filter("P"."BASEAMOUNT"<0.00 AND "P"."OPSTATUS"='0' AND ("P"."DATATYPE"='132' OR 
                  "P"."DATATYPE"='304' OR "P"."DATATYPE"='313' OR "P"."DATATYPE"='316' OR "P"."DATATYPE"='321' OR 
                  "P"."DATATYPE"='323' OR "P"."DATATYPE"='330' OR "P"."DATATYPE"='334' OR "P"."DATATYPE"='338' OR 
                  "P"."DATATYPE"='342' OR "P"."DATATYPE"='346' OR "P"."DATATYPE"='350' OR "P"."DATATYPE"='351' OR 
                  "P"."DATATYPE"='353' OR "P"."DATATYPE"='355' OR "P"."DATATYPE"='358' OR "P"."DATATYPE"='359' OR 
                  "P"."DATATYPE"='362' OR "P"."DATATYPE"='364' OR "P"."DATATYPE"='365' OR "P"."DATATYPE"='367' OR 
                  "P"."DATATYPE"='370' OR "P"."DATATYPE"='516' OR "P"."DATATYPE"='518' OR "P"."DATATYPE"='524' OR 
                  "P"."DATATYPE"='528' OR "P"."DATATYPE"='532' OR "P"."DATATYPE"='535' OR "P"."DATATYPE"='538' OR 
                  "P"."DATATYPE"='539' OR "P"."DATATYPE"='542' OR "P"."DATATYPE"='C04' OR "P"."DATATYPE"='C28' OR 
                  "P"."DATATYPE"='C30' OR "P"."DATATYPE"='C53' OR "P"."DATATYPE"='C55' OR "P"."DATATYPE"='C58' OR 
                  "P"."DATATYPE"='C59' OR "P"."DATATYPE"='C62' OR "P"."DATATYPE"='C64' OR "P"."DATATYPE"='C65' OR 
                  "P"."DATATYPE"='C70' OR "P"."DATATYPE"='C74' OR "P"."DATATYPE"='C75' OR "P"."DATATYPE"='C76' OR 
                  "P"."DATATYPE"='C79' OR "P"."DATATYPE"='C80' OR "P"."DATATYPE"='C83' OR "P"."DATATYPE"='F16' OR 
                  "P"."DATATYPE"='F18' OR "P"."DATATYPE"='F24' OR "P"."DATATYPE"='F28' OR "P"."DATATYPE"='F32' OR 
                  "P"."DATATYPE"='F35' OR "P"."DATATYPE"='F38' OR "P"."DATATYPE"='F39' OR "P"."DATATYPE"='F42' OR 
                  "P"."DATATYPE"='Y32'))
       8 - access("E2"."FATHERNO"="A"."SEQFEELIST")
      13 - filter("I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
      14 - filter("VATSEQPOLICY" IS NOT NULL AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND 
                  "I"."OPSTATUS"<>'4')
      16 - filter(:B1 IS NOT NULL)
      17 - access("SERIALNO"=:B1 AND "POLICYNO"=:B2)
           filter("OPSTATUS"<>'3')
      18 - access("SERIALNO"=:B1 AND "POLICYNO"=:B2)
           filter("OPSTATUS"<>'3' AND (LNNVL(:B1 IS NOT NULL) OR LNNVL("SERIALNO"=:B2)))
      19 - access("POLICYNO"=:B1)
           filter("STATUS"<>'4' AND ("SERIALNO"=:B1 OR :B2 IS NOT NULL AND "SERIALNO"=:B3))
      20 - access("FATHERNO"="TD"."SEQPOLICY")
      21 - filter((:B1 IS NULL AND "MM_PAYABLEMONEY_TD"."OFFSETNO"=:B2 OR :B3 IS NOT NULL AND 
                  "MM_PAYABLEMONEY_TD"."CUSTSEQ"=:B4) AND "MM_PAYABLEMONEY_TD"."BASECURRENCYCODE"=:B5 AND 
                  "MM_PAYABLEMONEY_TD"."UNITCODE"=:B6 AND "MM_PAYABLEMONEY_TD"."AMOUNT"=(-:B7) AND 
                  "MM_PAYABLEMONEY_TD"."OPSTATUS"='0' AND "MM_PAYABLEMONEY_TD"."BASEAMOUNT">0.00 AND 
                  TRIM("MM_PAYABLEMONEY_TD"."CUSTOMERCODE")=TRIM(:B8) AND ("MM_PAYABLEMONEY_TD"."DATATYPE"='122' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='302' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='311' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='314' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='319' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='325' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='328' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='332' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='336' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='340' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='344' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='348' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='352' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='354' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='356' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='357' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='360' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='361' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='363' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='366' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='367' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='370' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='502' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='504' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='506' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='508' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='512' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='514' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='522' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='526' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='534' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='536' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='537' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='540' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='541' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C02' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C28' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C30' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C54' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C56' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C57' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C60' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C61' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C63' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C66' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C68' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C72' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C75' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C77' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C78' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C81' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='C82' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F02' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F04' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F06' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F08' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F12' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F14' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F22' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F26' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F34' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F36' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F37' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='F40' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F41' OR 
                  "MM_PAYABLEMONEY_TD"."DATATYPE"='Y22'))
      22 - access("MM_PAYABLEMONEY_TD"."POLICYNO"=:B1)
      25 - filter("I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
      26 - filter("VATSEQPOLICY" IS NOT NULL AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND 
                  "I"."OPSTATUS"<>'4')
    

    优化后:

    执行时间:1s
    返回:0

  • 相关阅读:
    代码:城市名称的联想下拉框。可按拼音搜索、按汉字搜索,是一种很简单的实现方式
    代码:拖拽
    插件:zTree
    代码:遍历
    学习笔记:Stage.js(又叫Cut.js)——2D canvas 开发库,游戏方面的
    前端模块化、构建工具
    二级联动下拉菜单
    thinkphp的目录结构设计经验总结
    tp 路径表示
    liunx 根目录介绍
  • 原文地址:https://www.cnblogs.com/wanbin/p/9514669.html
Copyright © 2020-2023  润新知