利用WITH AS改写SQL

报表程序中一段SQL语句。
##优化前

返回:3952
耗时:224s
SQL 代码:

select to_date(nvl(pro.value, '1900-01-01 00:00:00'),
               'YYYY-MM-DD HH24:MI:SS') as LAST_UPDATE_TIME,
       p.productcode as COM_COVERAGE_CODE,
       p.policyno as POLICY_NO,
       p.productcode as POLICY_TYPE,
       nvl(pro3.value, '$$500002000004') as SALES_CHANNEL,
       p.inceptiondate as EFFECTIVE_DATE,
       p.terminationdate as EXPIRE_DATE,
       1 as INSURED_NO,
       null as BANK_CODE,
       to_date(pro1.value, 'YYYY-MM-DD HH24:MI:SS') as APPLICATION_DATE,
       p.issuedate as ACCEPT_DATE,
       '05' as SALES_TYPE,
       p.handler as SALES_CODE,
       pro2.staffname as SALES_NAME,
       p.agencyid as SALES_CHANNEL_CODE,
       pro4.value as SALES_CHANNEL_NAME,
       pro5.value as BUSINESS_ADDRESS,
       decode(p.renewalpolicyno, null, '01', '02') as CONTRACT_SOURCE,
       p.applicationno as CONTRACT_NO,
       null as RENEWAL_METHOD,
       p.policystatus as POLICY_STATUS,
       '0' as REJECTION,
       p.suminsured as SUM_INSURED,
       p.suminsured as EFFECTIVE_SUMINSURED,
       p.premium as PREMIUM,
       p.premium as CURRENT_PREMIUM,
       null as YEAR_PREMIUM,
       case
         when r4.paymentno > 1 then
          '09'
         else
          '01'
       end as PAYMENT_METHOD,
       null as PAYMENT_YEARS,
       decode(r4.paymentno, 0, 1, r4.paymentno) as PAYMENT_NO,
       p.productcode as POLICY_HOLDER_PRO,
       1 as POLICY_HOLDER_NUM,
       1 as EFFECTIVE_INSURED_NUM,
       p.renewalpolicyno as FORMER_POLICY_NO,
       pro6.specialremark as SPECIALRE_MARK,
       null as REGULAR_CLEARING_MARK,
       null as REGULAR_CLEARING,
       null as REGULAR_CLEARING_DATE,
       null as PREMIUMDUE_DATE,
       '0' as REALTIME_CLAIM_FLAG,
       '0' as POLICY_LOAN,
       '0' as AUTO_PAIDUP,
       p.coinsuranceflag as CO_INSURANCE,
       p.coinsurancerole as LEAD_CO_INSURANCE,
       null as CASH_VALUE,
       null as POLICY_REGISTER_ADDR,
       null as DEBIT_BANK,
       null as DEBIT_ACCOUNT,
       null as DEBIT_NAME
  from policy p
  left join role r
    on p.topactualid = r.topactualid
   and r.kind = 'DATEINFO'
  left join property pro
    on r.topactualid = pro.topactualid
   and r.actualid = pro.parentactualid
   and r.parentagreementid = pro.parentagreementid
   and r.topagreementid = pro.topagreementid
   and pro.kind = 'UNDERWRITINGDATE'
  left join property pro1
    on pro1.topactualid = p.topactualid
   and pro1.kind = 'APPLICATIONDATE'
  left join (select x.policyno as policyno,
                    x.topactualid as topactualid,
                    x.parentactualid as parentactualid,
                    max(decode(x.kind, 'SERIALNO', x.value, '')) as serialno,
                    max(decode(x.kind, 'STAFFNAME', x.value, '')) as staffname
               from (select p.policyno         as policyno,
                            pro.topactualid    as topactualid,
                            pro.parentactualid as parentactualid,
                            pro.kind           as kind,
                            pro.name           as name,
                            pro.value          as value
                       from policy p
                       left join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'HANDLER'
                       left join property pro
                         on pro.topactualid = r.topactualid
                        and pro.parentactualid = r.actualid
                        and pro.kind in ('SERIALNO', 'STAFFNAME')
                      where p.productcode in ('00070001',
                                              '00070002',
                                              '00070003',
                                              '00070004',
                                              '00070005',
                                              '00070006',
                                              '00130001')
                        and p.policystatus = '$$900001106001'
                        and p.endorsementid is null
                        and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
                        and (p.uniquecode like '013100%' or
                            p.uniquecode like '011000%')) x
              group by policyno, topactualid, parentactualid) pro2
    on pro2.policyno = p.policyno
   and pro2.topactualid = p.topactualid
   and pro2.serialno = '1'
  left join role r3
    on p.topactualid = r3.topactualid
   and r3.kind = 'INTERMEDIARYINFO'
  left join property pro3
    on r3.topactualid = pro3.topactualid
   and r3.actualid = pro3.parentactualid
   and r3.parentagreementid = pro3.parentagreementid
   and r3.topagreementid = pro3.topagreementid
   and pro3.kind = 'INTERMEDIARYTYPE'
  left join property pro4
    on r3.topactualid = pro4.topactualid
   and r3.actualid = pro4.parentactualid
   and r3.parentagreementid = pro4.parentagreementid
   and r3.topagreementid = pro4.topagreementid
   and pro4.kind = 'INTERMEDIARYNAME'
  left join property pro5
    on r3.topactualid = pro5.topactualid
   and r3.actualid = pro5.parentactualid
   and r3.parentagreementid = pro5.parentagreementid
   and r3.topagreementid = pro5.topagreementid
   and pro5.kind = 'OFFICEADDRESS'
  left join (select pro.policyno,
                    pro.topactualid,
                    replace(wm_concat(pro.text), ', ', '?') as specialremark
               from (select p.policyno, p.topactualid, pro2.value as text
                       from policy p
                      inner join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'SPECIALAGREEMENTITEM'
                       left join property pro1
                         on r.topactualid = pro1.topactualid
                        and r.actualid = pro1.parentactualid
                        and r.parentagreementid = pro1.parentagreementid
                        and r.topagreementid = pro1.topagreementid
                        and pro1.kind = 'SERIALNO'
                       left join property pro2
                         on r.topactualid = pro2.topactualid
                        and r.actualid = pro2.parentactualid
                        and r.parentagreementid = pro2.parentagreementid
                        and r.topagreementid = pro2.topagreementid
                        and pro2.kind = 'SPECIALAGREEMENTTEXT'
                      where p.productcode in ('00070001',
                                              '00070002',
                                              '00070003',
                                              '00070004',
                                              '00070005',
                                              '00070006',
                                              '00130001')
                        and p.policystatus = '$$900001106001'
                        and p.endorsementid is null
                        and (p.uniquecode like '013100%' or
                            p.uniquecode like '011000%')
                        and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
                      order by pro1.value) pro
              group by pro.policyno, pro.topactualid) pro6
    on p.policyno = pro6.policyno
   and p.topactualid = pro6.topactualid
  left join (select p.policyno, p.topactualid, count(*) as paymentno
               from policy p
               left join role r
                 on r.topactualid = p.topactualid
                and r.kind = 'PAYMENTSCHEDULEONAPPLICATION'
              where p.productcode in ('00070001',
                                      '00070002',
                                      '00070003',
                                      '00070004',
                                      '00070005',
                                      '00070006',
                                      '00130001')
                and p.policystatus = '$$900001106001'
                and p.endorsementid is null
                and (p.uniquecode like '013100%' or
                    p.uniquecode like '011000%')
                and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
              group by p.policyno, p.topactualid) r4
    on p.policyno = r4.policyno
   and p.topactualid = r4.topactualid
 where p.productcode in ('00070001',
                         '00070002',
                         '00070003',
                         '00070004',
                         '00070005',
                         '00070006',
                         '00130001')
   AND p.policystatus = '$$900001106001'
   and p.endorsementid is null
   and (p.uniquecode like '013100%' or p.uniquecode like '011000%')
   and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
 order by ACCEPT_DATE, POLICY_NO


Plan hash value: 3635118867
 
----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                     | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                              |                    | 29315 |   127M|       |   367K  (1)| 01:13:34 |
|   1 |  SORT ORDER BY                                |                    | 29315 |   127M|   458M|   367K  (1)| 01:13:34 |
|   2 |   NESTED LOOPS OUTER                          |                    | 29315 |   127M|       |   340K  (1)| 01:08:01 |
|   3 |    NESTED LOOPS OUTER                         |                    | 29315 |   125M|       |   232K  (1)| 00:46:31 |
|   4 |     NESTED LOOPS OUTER                        |                    |  4447 |    18M|       |   216K  (1)| 00:43:24 |
|   5 |      NESTED LOOPS OUTER                       |                    |  2534 |    10M|       |   206K  (1)| 00:41:24 |
|   6 |       NESTED LOOPS OUTER                      |                    |  2534 |    10M|       |   197K  (1)| 00:39:33 |
|   7 |        NESTED LOOPS OUTER                     |                    |  2534 |    10M|       |   188K  (1)| 00:37:41 |
|*  8 |         HASH JOIN OUTER                       |                    |  2534 |    10M|  5592K|   179K  (1)| 00:35:50 |
|   9 |          NESTED LOOPS OUTER                   |                    |  2534 |  5557K|       | 72919   (1)| 00:14:36 |
|* 10 |           HASH JOIN RIGHT OUTER               |                    |  1461 |  3140K|       | 68293   (1)| 00:13:40 |
|  11 |            VIEW                               |                    | 11415 |   367K|       |  6364   (1)| 00:01:17 |
|  12 |             HASH GROUP BY                     |                    | 11415 |  1036K|  2360K|  6364   (1)| 00:01:17 |
|* 13 |              HASH JOIN OUTER                  |                    | 11415 |  1036K|       |  6115   (1)| 00:01:14 |
|* 14 |               TABLE ACCESS FULL               | POLICY             |  1461 |    98K|       |  4261   (1)| 00:00:52 |
|* 15 |               INDEX RANGE SCAN                | IDX_ROLE_TEST2     |   380K|  8907K|       |  1851   (1)| 00:00:23 |
|* 16 |            HASH JOIN OUTER                    |                    |  1461 |  3093K|       | 61929   (1)| 00:12:24 |
|* 17 |             TABLE ACCESS FULL                 | POLICY             |  1461 |   208K|       |  4261   (1)| 00:00:52 |
|  18 |             VIEW                              |                    |  6221 |    11M|       | 57668   (1)| 00:11:33 |
|  19 |              SORT GROUP BY                    |                    |  6221 |    11M|    24M| 57668   (1)| 00:11:33 |
|  20 |               VIEW                            |                    |  6221 |    11M|       | 55036   (1)| 00:11:01 |
|  21 |                SORT ORDER BY                  |                    |  6221 |  1312K|  2856K| 55036   (1)| 00:11:01 |
|  22 |                 NESTED LOOPS OUTER            |                    |  6221 |  1312K|       | 54741   (1)| 00:10:57 |
|  23 |                  NESTED LOOPS OUTER           |                    |  6221 |  1002K|       | 31933   (1)| 00:06:24 |
|  24 |                   NESTED LOOPS                |                    |  6221 |   692K|       |  9125   (1)| 00:01:50 |
|* 25 |                    TABLE ACCESS FULL          | POLICY             |  1461 |    98K|       |  4261   (1)| 00:00:52 |
|  26 |                    TABLE ACCESS BY INDEX ROWID| ROLE               |     4 |   180 |       |     5   (0)| 00:00:01 |
|* 27 |                     INDEX RANGE SCAN          | IDX_ROLE_TEST2     |     4 |       |       |     3   (0)| 00:00:01 |
|* 28 |                   TABLE ACCESS BY INDEX ROWID | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 29 |                    INDEX RANGE SCAN           | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|* 30 |                  TABLE ACCESS BY INDEX ROWID  | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 31 |                   INDEX RANGE SCAN            | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|  32 |           TABLE ACCESS BY INDEX ROWID         | ROLE               |     2 |    90 |       |     4   (0)| 00:00:01 |
|* 33 |            INDEX RANGE SCAN                   | IDX_ROLE_TEST2     |     1 |       |       |     3   (0)| 00:00:01 |
|  34 |          VIEW                                 |                    | 73354 |   141M|       | 98838   (2)| 00:19:47 |
|* 35 |           FILTER                              |                    |       |       |       |            |          |
|  36 |            HASH GROUP BY                      |                    | 73354 |  9813K|  1092M| 98838   (2)| 00:19:47 |
|  37 |             NESTED LOOPS OUTER                |                    |  7335K|   958M|       | 18161   (1)| 00:03:38 |
|  38 |              NESTED LOOPS OUTER               |                    |  9913 |   968K|       |  9364   (1)| 00:01:53 |
|* 39 |               TABLE ACCESS FULL               | POLICY             |  1461 |    98K|       |  4261   (1)| 00:00:52 |
|  40 |               TABLE ACCESS BY INDEX ROWID     | ROLE               |     7 |   217 |       |     6   (0)| 00:00:01 |
|* 41 |                INDEX RANGE SCAN               | IDX_ROLE_TEST2     |     7 |       |       |     3   (0)| 00:00:01 |
|  42 |              VIEW                             |                    |   740 | 27380 |       |     1   (0)| 00:00:01 |
|  43 |               INLIST ITERATOR                 |                    |       |       |       |            |          |
|  44 |                TABLE ACCESS BY INDEX ROWID    | PROPERTY           |     1 |    37 |       |     6   (0)| 00:00:01 |
|* 45 |                 INDEX RANGE SCAN              | IDX_PROPERTY_TEST2 |     1 |       |       |     5   (0)| 00:00:01 |
|* 46 |         TABLE ACCESS BY INDEX ROWID           | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 47 |          INDEX RANGE SCAN                     | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|* 48 |        TABLE ACCESS BY INDEX ROWID            | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 49 |         INDEX RANGE SCAN                      | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|* 50 |       TABLE ACCESS BY INDEX ROWID             | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 51 |        INDEX RANGE SCAN                       | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|  52 |      TABLE ACCESS BY INDEX ROWID              | PROPERTY           |     2 |    60 |       |     5   (0)| 00:00:01 |
|* 53 |       INDEX RANGE SCAN                        | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
|  54 |     TABLE ACCESS BY INDEX ROWID               | ROLE               |     7 |   315 |       |     6   (0)| 00:00:01 |
|* 55 |      INDEX RANGE SCAN                         | IDX_ROLE_TEST2     |     7 |       |       |     3   (0)| 00:00:01 |
|* 56 |    TABLE ACCESS BY INDEX ROWID                | PROPERTY           |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 57 |     INDEX RANGE SCAN                          | IDX_PROPERTY_TEST2 |     1 |       |       |     3   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   8 - access("PRO2"."TOPACTUALID"(+)="P"."TOPACTUALID" AND "PRO2"."POLICYNO"(+)="P"."POLICYNO")
  10 - access("P"."TOPACTUALID"="R4"."TOPACTUALID"(+) AND "P"."POLICYNO"="R4"."POLICYNO"(+))
  13 - access("R"."TOPACTUALID"(+)="P"."TOPACTUALID")
  14 - filter("P"."ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "P"."ENDORSEMENTID" IS NULL AND 
              ("P"."PRODUCTCODE"='00070001' OR "P"."PRODUCTCODE"='00070002' OR "P"."PRODUCTCODE"='00070003' OR 
              "P"."PRODUCTCODE"='00070004' OR "P"."PRODUCTCODE"='00070005' OR "P"."PRODUCTCODE"='00070006' OR 
              "P"."PRODUCTCODE"='00130001') AND ("P"."UNIQUECODE" LIKE '013100%' OR "P"."UNIQUECODE" LIKE '011000%') AND 
              "P"."POLICYSTATUS"='$$900001106001')
  15 - access("R"."KIND"(+)='PAYMENTSCHEDULEONAPPLICATION')
  16 - access("P"."TOPACTUALID"="PRO6"."TOPACTUALID"(+) AND "P"."POLICYNO"="PRO6"."POLICYNO"(+))
  17 - filter("P"."ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "P"."ENDORSEMENTID" IS NULL AND 
              ("P"."PRODUCTCODE"='00070001' OR "P"."PRODUCTCODE"='00070002' OR "P"."PRODUCTCODE"='00070003' OR 
              "P"."PRODUCTCODE"='00070004' OR "P"."PRODUCTCODE"='00070005' OR "P"."PRODUCTCODE"='00070006' OR 
              "P"."PRODUCTCODE"='00130001') AND ("P"."UNIQUECODE" LIKE '013100%' OR "P"."UNIQUECODE" LIKE '011000%') AND 
              "P"."POLICYSTATUS"='$$900001106001')
  25 - filter("P"."ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "P"."ENDORSEMENTID" IS NULL AND 
              ("P"."PRODUCTCODE"='00070001' OR "P"."PRODUCTCODE"='00070002' OR "P"."PRODUCTCODE"='00070003' OR 
              "P"."PRODUCTCODE"='00070004' OR "P"."PRODUCTCODE"='00070005' OR "P"."PRODUCTCODE"='00070006' OR 
              "P"."PRODUCTCODE"='00130001') AND ("P"."UNIQUECODE" LIKE '013100%' OR "P"."UNIQUECODE" LIKE '011000%') AND 
              "P"."POLICYSTATUS"='$$900001106001')
  27 - access("R"."KIND"='SPECIALAGREEMENTITEM' AND "R"."TOPACTUALID"="P"."TOPACTUALID")
  28 - filter("R"."TOPAGREEMENTID"="PRO2"."TOPAGREEMENTID"(+) AND 
              "R"."PARENTAGREEMENTID"="PRO2"."PARENTAGREEMENTID"(+))
  29 - access("PRO2"."KIND"(+)='SPECIALAGREEMENTTEXT' AND "R"."TOPACTUALID"="PRO2"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO2"."PARENTACTUALID"(+))
  30 - filter("R"."TOPAGREEMENTID"="PRO1"."TOPAGREEMENTID"(+) AND 
              "R"."PARENTAGREEMENTID"="PRO1"."PARENTAGREEMENTID"(+))
  31 - access("PRO1"."KIND"(+)='SERIALNO' AND "R"."TOPACTUALID"="PRO1"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO1"."PARENTACTUALID"(+))
  33 - access("R3"."KIND"(+)='INTERMEDIARYINFO' AND "P"."TOPACTUALID"="R3"."TOPACTUALID"(+))
  35 - filter(MAX(DECODE("PRO"."KIND",'SERIALNO',"PRO"."VALUE",''))='1')
  39 - filter("P"."ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "P"."ENDORSEMENTID" IS NULL AND 
              ("P"."PRODUCTCODE"='00070001' OR "P"."PRODUCTCODE"='00070002' OR "P"."PRODUCTCODE"='00070003' OR 
              "P"."PRODUCTCODE"='00070004' OR "P"."PRODUCTCODE"='00070005' OR "P"."PRODUCTCODE"='00070006' OR 
              "P"."PRODUCTCODE"='00130001') AND ("P"."UNIQUECODE" LIKE '013100%' OR "P"."UNIQUECODE" LIKE '011000%') AND 
              "P"."POLICYSTATUS"='$$900001106001')
  41 - access("R"."KIND"(+)='HANDLER' AND "R"."TOPACTUALID"(+)="P"."TOPACTUALID")
  45 - access(("PRO"."KIND"='SERIALNO' OR "PRO"."KIND"='STAFFNAME') AND "PRO"."TOPACTUALID"="R"."TOPACTUALID" AND 
              "PRO"."PARENTACTUALID"="R"."ACTUALID")
  46 - filter("R3"."TOPAGREEMENTID"="PRO3"."TOPAGREEMENTID"(+) AND 
              "R3"."PARENTAGREEMENTID"="PRO3"."PARENTAGREEMENTID"(+))
  47 - access("PRO3"."KIND"(+)='INTERMEDIARYTYPE' AND "R3"."TOPACTUALID"="PRO3"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO3"."PARENTACTUALID"(+))
  48 - filter("R3"."TOPAGREEMENTID"="PRO4"."TOPAGREEMENTID"(+) AND 
              "R3"."PARENTAGREEMENTID"="PRO4"."PARENTAGREEMENTID"(+))
  49 - access("PRO4"."KIND"(+)='INTERMEDIARYNAME' AND "R3"."TOPACTUALID"="PRO4"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO4"."PARENTACTUALID"(+))
  50 - filter("R3"."TOPAGREEMENTID"="PRO5"."TOPAGREEMENTID"(+) AND 
              "R3"."PARENTAGREEMENTID"="PRO5"."PARENTAGREEMENTID"(+))
  51 - access("PRO5"."KIND"(+)='OFFICEADDRESS' AND "R3"."TOPACTUALID"="PRO5"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO5"."PARENTACTUALID"(+))
  53 - access("PRO1"."KIND"(+)='APPLICATIONDATE' AND "PRO1"."TOPACTUALID"(+)="P"."TOPACTUALID")
  55 - access("R"."KIND"(+)='DATEINFO' AND "P"."TOPACTUALID"="R"."TOPACTUALID"(+))
  56 - filter("R"."TOPAGREEMENTID"="PRO"."TOPAGREEMENTID"(+) AND 
              "R"."PARENTAGREEMENTID"="PRO"."PARENTAGREEMENTID"(+))
  57 - access("PRO"."KIND"(+)='UNDERWRITINGDATE' AND "R"."TOPACTUALID"="PRO"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO"."PARENTACTUALID"(+))

##分析
分析SQL代码,可以看出访问多次policy表,谓词条件也一样

  left join (select x.policyno as policyno,
                    x.topactualid as topactualid,
                    x.parentactualid as parentactualid,
                    max(decode(x.kind, 'SERIALNO', x.value, '')) as serialno,
                    max(decode(x.kind, 'STAFFNAME', x.value, '')) as staffname
               from (select p.policyno         as policyno,
                            pro.topactualid    as topactualid,
                            pro.parentactualid as parentactualid,
                            pro.kind           as kind,
                            pro.name           as name,
                            pro.value          as value
                       from policy p
                       left join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'HANDLER'
                       left join property pro
                         on pro.topactualid = r.topactualid
                        and pro.parentactualid = r.actualid
                        and pro.kind in ('SERIALNO', 'STAFFNAME')
                      where p.productcode in ('00070001',
                                              '00070002',
                                              '00070003',
                                              '00070004',
                                              '00070005',
                                              '00070006',
                                              '00130001')
                        and p.policystatus = '$$900001106001'
                        and p.endorsementid is null
                        and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
                        and (p.uniquecode like '013100%' or
                            p.uniquecode like '011000%')) x
              group by policyno, topactualid, parentactualid) pro2
-----------------------------------------------------------------------
  left join (select pro.policyno,
                    pro.topactualid,
                    replace(wm_concat(pro.text), ', ', '?') as specialremark
               from (select p.policyno, p.topactualid, pro2.value as text
                       from policy p
                      inner join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'SPECIALAGREEMENTITEM'
                       left join property pro1
                         on r.topactualid = pro1.topactualid
                        and r.actualid = pro1.parentactualid
                        and r.parentagreementid = pro1.parentagreementid
                        and r.topagreementid = pro1.topagreementid
                        and pro1.kind = 'SERIALNO'
                       left join property pro2
                         on r.topactualid = pro2.topactualid
                        and r.actualid = pro2.parentactualid
                        and r.parentagreementid = pro2.parentagreementid
                        and r.topagreementid = pro2.topagreementid
                        and pro2.kind = 'SPECIALAGREEMENTTEXT'
                      where p.productcode in ('00070001',
                                              '00070002',
                                              '00070003',
                                              '00070004',
                                              '00070005',
                                              '00070006',
                                              '00130001')
                        and p.policystatus = '$$900001106001'
                        and p.endorsementid is null
                        and (p.uniquecode like '013100%' or
                            p.uniquecode like '011000%')
                        and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
                      order by pro1.value) pro
              group by pro.policyno, pro.topactualid) pro6


-------------------------------------------------------------------
  left join (select p.policyno, p.topactualid, count(*) as paymentno
               from policy p
               left join role r
                 on r.topactualid = p.topactualid
                and r.kind = 'PAYMENTSCHEDULEONAPPLICATION'
              where p.productcode in ('00070001',
                                      '00070002',
                                      '00070003',
                                      '00070004',
                                      '00070005',
                                      '00070006',
                                      '00130001')
                and p.policystatus = '$$900001106001'
                and p.endorsementid is null
                and (p.uniquecode like '013100%' or
                    p.uniquecode like '011000%')
                and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
              group by p.policyno, p.topactualid) r4

##优化

耗时:10s
返回:3952

利用with as 先把访问policy表数据提取并缓存成临时表,然后再进行关联查询。

with p as     
         (select policyno,topactualid from policy    
              where productcode in ('00070001',
                                      '00070002',
                                      '00070003',
                                      '00070004',
                                      '00070005',
                                      '00070006',
                                      '00130001')
                and policystatus = '$$900001106001'
                and endorsementid is null
                and (uniquecode like '013100%' or
                    uniquecode like '011000%')
                and ISSUEDATE > to_date('20160411', 'YYYYMMDD'))
select to_date(nvl(pro.value, '1900-01-01 00:00:00'),
               'YYYY-MM-DD HH24:MI:SS') as LAST_UPDATE_TIME,
       p.productcode as COM_COVERAGE_CODE,
       p.policyno as POLICY_NO,
       p.productcode as POLICY_TYPE,
       nvl(pro3.value, '$$500002000004') as SALES_CHANNEL,
       p.inceptiondate as EFFECTIVE_DATE,
       p.terminationdate as EXPIRE_DATE,
       1 as INSURED_NO,
       null as BANK_CODE,
       to_date(pro1.value, 'YYYY-MM-DD HH24:MI:SS') as APPLICATION_DATE,
       p.issuedate as ACCEPT_DATE,
       '05' as SALES_TYPE,
       p.handler as SALES_CODE,
       pro2.staffname as SALES_NAME,
       p.agencyid as SALES_CHANNEL_CODE,
       pro4.value as SALES_CHANNEL_NAME,
       pro5.value as BUSINESS_ADDRESS,
       decode(p.renewalpolicyno, null, '01', '02') as CONTRACT_SOURCE,
       p.applicationno as CONTRACT_NO,
       null as RENEWAL_METHOD,
       p.policystatus as POLICY_STATUS,
       '0' as REJECTION,
       p.suminsured as SUM_INSURED,
       p.suminsured as EFFECTIVE_SUMINSURED,
       p.premium as PREMIUM,
       p.premium as CURRENT_PREMIUM,
       null as YEAR_PREMIUM,
       case
         when r4.paymentno > 1 then
          '09'
         else
          '01'
       end as PAYMENT_METHOD,
       null as PAYMENT_YEARS,
       decode(r4.paymentno, 0, 1, r4.paymentno) as PAYMENT_NO,
       p.productcode as POLICY_HOLDER_PRO,
       1 as POLICY_HOLDER_NUM,
       1 as EFFECTIVE_INSURED_NUM,
       p.renewalpolicyno as FORMER_POLICY_NO,
       pro6.specialremark as SPECIALRE_MARK,
       null as REGULAR_CLEARING_MARK,
       null as REGULAR_CLEARING,
       null as REGULAR_CLEARING_DATE,
       null as PREMIUMDUE_DATE,
       '0' as REALTIME_CLAIM_FLAG,
       '0' as POLICY_LOAN,
       '0' as AUTO_PAIDUP,
       p.coinsuranceflag as CO_INSURANCE,
       p.coinsurancerole as LEAD_CO_INSURANCE,
       null as CASH_VALUE,
       null as POLICY_REGISTER_ADDR,
       null as DEBIT_BANK,
       null as DEBIT_ACCOUNT,
       null as DEBIT_NAME
  from policy p
  left join role r
    on p.topactualid = r.topactualid
   and r.kind = 'DATEINFO'
  left join property pro
    on r.topactualid = pro.topactualid
   and r.actualid = pro.parentactualid
   and r.parentagreementid = pro.parentagreementid
   and r.topagreementid = pro.topagreementid
   and pro.kind = 'UNDERWRITINGDATE'
  left join property pro1
    on pro1.topactualid = p.topactualid
   and pro1.kind = 'APPLICATIONDATE'
  left join (select x.policyno as policyno,
                    x.topactualid as topactualid,
                    x.parentactualid as parentactualid,
                    max(decode(x.kind, 'SERIALNO', x.value, '')) as serialno,
                    max(decode(x.kind, 'STAFFNAME', x.value, '')) as staffname
               from (select p.policyno         as policyno,
                            pro.topactualid    as topactualid,
                            pro.parentactualid as parentactualid,
                            pro.kind           as kind,
                            pro.name           as name,
                            pro.value          as value
                       from  p
                       left join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'HANDLER'
                       left join property pro
                         on pro.topactualid = r.topactualid
                        and pro.parentactualid = r.actualid
                        and pro.kind in ('SERIALNO', 'STAFFNAME')) x
              group by policyno, topactualid, parentactualid) pro2
    on pro2.policyno = p.policyno
   and pro2.topactualid = p.topactualid
   and pro2.serialno = '1'
  left join role r3
    on p.topactualid = r3.topactualid
   and r3.kind = 'INTERMEDIARYINFO'
  left join property pro3
    on r3.topactualid = pro3.topactualid
   and r3.actualid = pro3.parentactualid
   and r3.parentagreementid = pro3.parentagreementid
   and r3.topagreementid = pro3.topagreementid
   and pro3.kind = 'INTERMEDIARYTYPE'
  left join property pro4
    on r3.topactualid = pro4.topactualid
   and r3.actualid = pro4.parentactualid
   and r3.parentagreementid = pro4.parentagreementid
   and r3.topagreementid = pro4.topagreementid
   and pro4.kind = 'INTERMEDIARYNAME'
  left join property pro5
    on r3.topactualid = pro5.topactualid
   and r3.actualid = pro5.parentactualid
   and r3.parentagreementid = pro5.parentagreementid
   and r3.topagreementid = pro5.topagreementid
   and pro5.kind = 'OFFICEADDRESS'
  left join (select pro.policyno,
                    pro.topactualid,
                    replace(wm_concat(pro.text), ', ', '?') as specialremark
               from (select p.policyno, p.topactualid, pro2.value as text
                       from  p
                      inner join role r
                         on r.topactualid = p.topactualid
                        and r.kind = 'SPECIALAGREEMENTITEM'
                       left join property pro1
                         on r.topactualid = pro1.topactualid
                        and r.actualid = pro1.parentactualid
                        and r.parentagreementid = pro1.parentagreementid
                        and r.topagreementid = pro1.topagreementid
                        and pro1.kind = 'SERIALNO'
                       left join property pro2
                         on r.topactualid = pro2.topactualid
                        and r.actualid = pro2.parentactualid
                        and r.parentagreementid = pro2.parentagreementid
                        and r.topagreementid = pro2.topagreementid
                        and pro2.kind = 'SPECIALAGREEMENTTEXT'
                      order by pro1.value) pro
              group by pro.policyno, pro.topactualid) pro6
    on p.policyno = pro6.policyno
   and p.topactualid = pro6.topactualid
  left join (select p.policyno, p.topactualid, count(*) as paymentno
               from  p
               left join role r
                 on r.topactualid = p.topactualid
                and r.kind = 'PAYMENTSCHEDULEONAPPLICATION'
              group by p.policyno, p.topactualid) r4
    on p.policyno = r4.policyno
   and p.topactualid = r4.topactualid
 where p.productcode in ('00070001',
                         '00070002',
                         '00070003',
                         '00070004',
                         '00070005',
                         '00070006',
                         '00130001')
   AND p.policystatus = '$$900001106001'
   and p.endorsementid is null
   and (p.uniquecode like '013100%' or p.uniquecode like '011000%')
   and p.ISSUEDATE > to_date('20160411', 'YYYYMMDD')
 order by ACCEPT_DATE, POLICY_NO;


Plan hash value: 3669690643
 
--------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                      | Name                        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                               |                             | 29315 |   127M|       |   332K  (1)| 01:06:29 |
|   1 |  TEMP TABLE TRANSFORMATION                     |                             |       |       |       |            |          |
|   2 |   LOAD AS SELECT                               |                             |       |       |       |            |          |
|*  3 |    TABLE ACCESS FULL                           | POLICY                      |  1461 |    98K|       |  4261   (1)| 00:00:52 |
|   4 |   SORT ORDER BY                                |                             | 29315 |   127M|   458M|   328K  (1)| 01:05:37 |
|   5 |    NESTED LOOPS OUTER                          |                             | 29315 |   127M|       |   300K  (1)| 01:00:04 |
|   6 |     NESTED LOOPS OUTER                         |                             | 29315 |   125M|       |   192K  (1)| 00:38:34 |
|   7 |      NESTED LOOPS OUTER                        |                             |  4447 |    18M|       |   177K  (1)| 00:35:28 |
|   8 |       NESTED LOOPS OUTER                       |                             |  2534 |    10M|       |   167K  (1)| 00:33:28 |
|   9 |        NESTED LOOPS OUTER                      |                             |  2534 |    10M|       |   157K  (1)| 00:31:36 |
|  10 |         NESTED LOOPS OUTER                     |                             |  2534 |    10M|       |   148K  (1)| 00:29:45 |
|* 11 |          HASH JOIN OUTER                       |                             |  2534 |    10M|  5592K|   139K  (1)| 00:27:53 |
|  12 |           NESTED LOOPS OUTER                   |                             |  2534 |  5557K|       | 64290   (1)| 00:12:52 |
|* 13 |            HASH JOIN RIGHT OUTER               |                             |  1461 |  3140K|       | 59665   (1)| 00:11:56 |
|  14 |             VIEW                               |                             | 11414 |   367K|       |  1991   (1)| 00:00:24 |
|  15 |              HASH GROUP BY                     |                             | 11414 |   490K|  1176K|  1991   (1)| 00:00:24 |
|* 16 |               HASH JOIN OUTER                  |                             | 11414 |   490K|       |  1860   (1)| 00:00:23 |
|  17 |                VIEW                            |                             |  1461 | 29220 |       |     5   (0)| 00:00:01 |
|  18 |                 TABLE ACCESS FULL              | SYS_TEMP_0FD9D6613_773E7914 |  1461 | 29220 |       |     5   (0)| 00:00:01 |
|* 19 |                INDEX RANGE SCAN                | IDX_ROLE_TEST2              |   380K|  8907K|       |  1851   (1)| 00:00:23 |
|* 20 |             HASH JOIN OUTER                    |                             |  1461 |  3093K|       | 57674   (1)| 00:11:33 |
|* 21 |              TABLE ACCESS FULL                 | POLICY                      |  1461 |   208K|       |  4261   (1)| 00:00:52 |
|  22 |              VIEW                              |                             |  6221 |    11M|       | 53413   (1)| 00:10:41 |
|  23 |               SORT GROUP BY                    |                             |  6221 |    11M|    24M| 53413   (1)| 00:10:41 |
|  24 |                VIEW                            |                             |  6221 |    11M|       | 50780   (1)| 00:10:10 |
|  25 |                 SORT ORDER BY                  |                             |  6221 |  1312K|  2856K| 50780   (1)| 00:10:10 |
|  26 |                  NESTED LOOPS OUTER            |                             |  6221 |  1312K|       | 50485   (1)| 00:10:06 |
|  27 |                   NESTED LOOPS OUTER           |                             |  6221 |  1002K|       | 27677   (1)| 00:05:33 |
|  28 |                    NESTED LOOPS                |                             |  6221 |   692K|       |  4869   (1)| 00:00:59 |
|  29 |                     VIEW                       |                             |  1461 |    98K|       |     5   (0)| 00:00:01 |
|  30 |                      TABLE ACCESS FULL         | SYS_TEMP_0FD9D6613_773E7914 |  1461 | 29220 |       |     5   (0)| 00:00:01 |
|  31 |                     TABLE ACCESS BY INDEX ROWID| ROLE                        |     4 |   180 |       |     5   (0)| 00:00:01 |
|* 32 |                      INDEX RANGE SCAN          | IDX_ROLE_TEST2              |     4 |       |       |     3   (0)| 00:00:01 |
|* 33 |                    TABLE ACCESS BY INDEX ROWID | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 34 |                     INDEX RANGE SCAN           | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|* 35 |                   TABLE ACCESS BY INDEX ROWID  | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 36 |                    INDEX RANGE SCAN            | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|  37 |            TABLE ACCESS BY INDEX ROWID         | ROLE                        |     2 |    90 |       |     4   (0)| 00:00:01 |
|* 38 |             INDEX RANGE SCAN                   | IDX_ROLE_TEST2              |     1 |       |       |     3   (0)| 00:00:01 |
|  39 |           VIEW                                 |                             | 73346 |   141M|       | 67762   (2)| 00:13:34 |
|* 40 |            FILTER                              |                             |       |       |       |            |          |
|  41 |             HASH GROUP BY                      |                             | 73346 |  6303K|   714M| 67762   (2)| 00:13:34 |
|  42 |              NESTED LOOPS OUTER                |                             |  7334K|   615M|       | 13903   (1)| 00:02:47 |
|  43 |               NESTED LOOPS OUTER               |                             |  9912 |   493K|       |  5109   (1)| 00:01:02 |
|  44 |                VIEW                            |                             |  1461 | 29220 |       |     5   (0)| 00:00:01 |
|  45 |                 TABLE ACCESS FULL              | SYS_TEMP_0FD9D6613_773E7914 |  1461 | 29220 |       |     5   (0)| 00:00:01 |
|  46 |                TABLE ACCESS BY INDEX ROWID     | ROLE                        |     7 |   217 |       |     6   (0)| 00:00:01 |
|* 47 |                 INDEX RANGE SCAN               | IDX_ROLE_TEST2              |     7 |       |       |     3   (0)| 00:00:01 |
|  48 |               VIEW                             |                             |   740 | 27380 |       |     1   (0)| 00:00:01 |
|  49 |                INLIST ITERATOR                 |                             |       |       |       |            |          |
|  50 |                 TABLE ACCESS BY INDEX ROWID    | PROPERTY                    |     1 |    37 |       |     6   (0)| 00:00:01 |
|* 51 |                  INDEX RANGE SCAN              | IDX_PROPERTY_TEST2          |     1 |       |       |     5   (0)| 00:00:01 |
|* 52 |          TABLE ACCESS BY INDEX ROWID           | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 53 |           INDEX RANGE SCAN                     | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|* 54 |         TABLE ACCESS BY INDEX ROWID            | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 55 |          INDEX RANGE SCAN                      | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|* 56 |        TABLE ACCESS BY INDEX ROWID             | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 57 |         INDEX RANGE SCAN                       | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|  58 |       TABLE ACCESS BY INDEX ROWID              | PROPERTY                    |     2 |    60 |       |     5   (0)| 00:00:01 |
|* 59 |        INDEX RANGE SCAN                        | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
|  60 |      TABLE ACCESS BY INDEX ROWID               | ROLE                        |     7 |   315 |       |     6   (0)| 00:00:01 |
|* 61 |       INDEX RANGE SCAN                         | IDX_ROLE_TEST2              |     7 |       |       |     3   (0)| 00:00:01 |
|* 62 |     TABLE ACCESS BY INDEX ROWID                | PROPERTY                    |     1 |    51 |       |     4   (0)| 00:00:01 |
|* 63 |      INDEX RANGE SCAN                          | IDX_PROPERTY_TEST2          |     1 |       |       |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter("ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "ENDORSEMENTID" IS NULL AND ("PRODUCTCODE"='00070001' OR 
              "PRODUCTCODE"='00070002' OR "PRODUCTCODE"='00070003' OR "PRODUCTCODE"='00070004' OR "PRODUCTCODE"='00070005' OR 
              "PRODUCTCODE"='00070006' OR "PRODUCTCODE"='00130001') AND ("UNIQUECODE" LIKE '013100%' OR "UNIQUECODE" LIKE '011000%') AND 
              "POLICYSTATUS"='$$900001106001')
  11 - access("PRO2"."TOPACTUALID"(+)="P"."TOPACTUALID" AND "PRO2"."POLICYNO"(+)="P"."POLICYNO")
  13 - access("P"."TOPACTUALID"="R4"."TOPACTUALID"(+) AND "P"."POLICYNO"="R4"."POLICYNO"(+))
  16 - access("R"."TOPACTUALID"(+)="P"."TOPACTUALID")
  19 - access("R"."KIND"(+)='PAYMENTSCHEDULEONAPPLICATION')
  20 - access("P"."TOPACTUALID"="PRO6"."TOPACTUALID"(+) AND "P"."POLICYNO"="PRO6"."POLICYNO"(+))
  21 - filter("P"."ISSUEDATE">TIMESTAMP' 2016-04-11 00:00:00' AND "P"."ENDORSEMENTID" IS NULL AND 
              ("P"."PRODUCTCODE"='00070001' OR "P"."PRODUCTCODE"='00070002' OR "P"."PRODUCTCODE"='00070003' OR "P"."PRODUCTCODE"='00070004' 
              OR "P"."PRODUCTCODE"='00070005' OR "P"."PRODUCTCODE"='00070006' OR "P"."PRODUCTCODE"='00130001') AND ("P"."UNIQUECODE" LIKE 
              '013100%' OR "P"."UNIQUECODE" LIKE '011000%') AND "P"."POLICYSTATUS"='$$900001106001')
  32 - access("R"."KIND"='SPECIALAGREEMENTITEM' AND "R"."TOPACTUALID"="P"."TOPACTUALID")
  33 - filter("R"."TOPAGREEMENTID"="PRO2"."TOPAGREEMENTID"(+) AND "R"."PARENTAGREEMENTID"="PRO2"."PARENTAGREEMENTID"(+))
  34 - access("PRO2"."KIND"(+)='SPECIALAGREEMENTTEXT' AND "R"."TOPACTUALID"="PRO2"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO2"."PARENTACTUALID"(+))
  35 - filter("R"."TOPAGREEMENTID"="PRO1"."TOPAGREEMENTID"(+) AND "R"."PARENTAGREEMENTID"="PRO1"."PARENTAGREEMENTID"(+))
  36 - access("PRO1"."KIND"(+)='SERIALNO' AND "R"."TOPACTUALID"="PRO1"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO1"."PARENTACTUALID"(+))
  38 - access("R3"."KIND"(+)='INTERMEDIARYINFO' AND "P"."TOPACTUALID"="R3"."TOPACTUALID"(+))
  40 - filter(MAX(DECODE("PRO"."KIND",'SERIALNO',"PRO"."VALUE",''))='1')
  47 - access("R"."KIND"(+)='HANDLER' AND "R"."TOPACTUALID"(+)="P"."TOPACTUALID")
  51 - access(("PRO"."KIND"='SERIALNO' OR "PRO"."KIND"='STAFFNAME') AND "PRO"."TOPACTUALID"="R"."TOPACTUALID" AND 
              "PRO"."PARENTACTUALID"="R"."ACTUALID")
  52 - filter("R3"."TOPAGREEMENTID"="PRO3"."TOPAGREEMENTID"(+) AND "R3"."PARENTAGREEMENTID"="PRO3"."PARENTAGREEMENTID"(+))
  53 - access("PRO3"."KIND"(+)='INTERMEDIARYTYPE' AND "R3"."TOPACTUALID"="PRO3"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO3"."PARENTACTUALID"(+))
  54 - filter("R3"."TOPAGREEMENTID"="PRO4"."TOPAGREEMENTID"(+) AND "R3"."PARENTAGREEMENTID"="PRO4"."PARENTAGREEMENTID"(+))
  55 - access("PRO4"."KIND"(+)='INTERMEDIARYNAME' AND "R3"."TOPACTUALID"="PRO4"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO4"."PARENTACTUALID"(+))
  56 - filter("R3"."TOPAGREEMENTID"="PRO5"."TOPAGREEMENTID"(+) AND "R3"."PARENTAGREEMENTID"="PRO5"."PARENTAGREEMENTID"(+))
  57 - access("PRO5"."KIND"(+)='OFFICEADDRESS' AND "R3"."TOPACTUALID"="PRO5"."TOPACTUALID"(+) AND 
              "R3"."ACTUALID"="PRO5"."PARENTACTUALID"(+))
  59 - access("PRO1"."KIND"(+)='APPLICATIONDATE' AND "PRO1"."TOPACTUALID"(+)="P"."TOPACTUALID")
  61 - access("R"."KIND"(+)='DATEINFO' AND "P"."TOPACTUALID"="R"."TOPACTUALID"(+))
  62 - filter("R"."TOPAGREEMENTID"="PRO"."TOPAGREEMENTID"(+) AND "R"."PARENTAGREEMENTID"="PRO"."PARENTAGREEMENTID"(+))
  63 - access("PRO"."KIND"(+)='UNDERWRITINGDATE' AND "R"."TOPACTUALID"="PRO"."TOPACTUALID"(+) AND 
              "R"."ACTUALID"="PRO"."PARENTACTUALID"(+))

你可能感兴趣的:(Oracle,sql优化,Oracle,SQL,优化)