用with改写优化sql之二

这是另一个网友发的sql,这个有点儿坑

SYS@netdb1(netdb61)>select l_target.*, rownum as rn
  2            FROM (select l0.l0_id as l0Id,
  3                         l0.date1 as createDate,
  4                         l0.id1 as applyId,
  5                         bai.stitle as applyTitle,
  6                         bai.amt1 as applyAmt,
  7                         bai.rate1 as applyRatio,
  8                         l0.value1 as oriPri,
  9                         l0.value2 as leftAmt,
 10                         sum(case
 11                               when lpi.status != '1' then
 12                                1
 13                               else
 14                                0
 15                             end) as remPeriods,
 16                         l0.flag1 AS flag2,
 17                         curi.s_cnname AS name2,
 18                         curi.i_user_id AS sellUserId
 19                    from l0
 20                    left join lpp
 21                      on lpp.l0_id = l0.l0_id
 22                    left join lpi0 lpi
 23                      on lpi.id3 = lpp.id3
 24                    left join b_apply_info bai
 25                      on bai.i_id1 = l0.id1
 26                    left join p_borrower_product pbp0
 27                      on pbp0.id1 = l0.id1
 28                    left join p_product pp0
 29                      on pbp0.id2 = pp0.id2
 30                   INNER JOIN c_user_regist_info curi
 31                      ON l0.creditor_user_id = curi.i_user_id
 32                   where 1 = 1
 33                     and l0.creditor_user_id = 5263
 34                     and l0.status != '2'
 35                     AND l0.flag1 = '1'
 36                     and pp0.product_type = 1
 37                   group by l0.l0_id,
 38                            l0.value1,
 39                            l0.value2,
 40                            l0.id1,
 41                            l0.date1,
 42                            bai.stitle,
 43                            bai.amt1,
 44                            bai.rate1,
 45                            l0.flag1,
 46                            curi.s_cnname,
 47                            curi.i_user_id) l_target
 48           inner join (select l2.l0_id,
 49                             l2.creditor_user_id,
 50                             lpi0.PERIOD_NUM,
 51                             lpi0.period_end_time
 52                        from l0 l2
 53                        left join lpp0
 54                          on l2.l0_id = lpp0.l0_id
 55                        left join lpi0 lpi0
 56                          on lpp0.id3 = lpi0.id3
 57                        left join arda0
 58                          on arda0.id3 = lpi0.id3
 59                       where l2.creditor_user_id =5263
 60                         and l2.status != '2'
 61                         and lpi0.period_start_time <= sysdate
 62                         and lpi0.period_end_time > sysdate
 63                       group by l2.l0_id,
 64                                lpi0.PERIOD_NUM,
 65                                l2.creditor_user_id,
 66                                lpi0.period_end_time
 67                      having sum(arda0.REPAYMENT_AMT) = 0 or sum(arda0.REPAYMENT_AMT) is null) l_cur
 68              on l_cur.l0_id = l_target.l0Id 
 69            left join (select lpp0.l0_id, lpp0.status, lpp0.PERIOD
 70                        from lpp0
 71                       inner join (select l2.l0_id,
 72                                         l2.creditor_user_id,
 73                                         lpi0.PERIOD_NUM,
 74                                         lpi0.period_end_time
 75                                    from l0 l2
 76                                    left join lpp0
 77                                      on l2.l0_id = lpp0.l0_id
 78                                    left join lpi0 lpi0
 79                                      on lpp0.id3 =
 80                                         lpi0.id3
 81                                    left join arda0
 82                                      on arda0.id3 =
 83                                         lpi0.id3
 84                                   where l2.creditor_user_id =5263
 85                                     and l2.status != '2'
 86                                     and lpi0.period_start_time <= sysdate
 87                                     and lpi0.period_end_time > sysdate
 88                                   group by l2.l0_id,
 89                                            lpi0.PERIOD_NUM,
 90                                            l2.creditor_user_id,
 91                                            lpi0.period_end_time
 92                                  having sum(arda0.REPAYMENT_AMT) = 0 or sum(arda0.REPAYMENT_AMT) is null) lc
 93                          on lc.l0_id = lpp0.l0_id
 94                       where lc.PERIOD_NUM = lpp0.PERIOD + 1) l_pre
 95              on l_pre.l0_id = l_target.l0Id 
 96            left join (select ttla.SELLER_l0_ID,
 97                             count(*) t_cnt,
 98                             max(transferable) transferable
 99                        from tla_transfer_l0_apply ttla
100                       where 1 = 1
101                         AND ttla.SELLER_ID =5263
102                       group by ttla.SELLER_l0_ID) l_tran
103              on l_tran.SELLER_l0_ID = l_target.l0Id
104            left join (select *
105                        from tla_transfer_l0_apply
106                       where transferable = '1') ttla1
107              on ttla1.seller_l0_id = l_target.l0Id
108           where 1 = 1
109             and (l_tran.transferable is null or l_tran.transferable != '1') 
110             and applyRatio=12
111           ORDER by leftAmt desc;

步惊云  14:48:54
-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                                   | Name                          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                            |                               |     2 |   594 | 15752   (3)| 00:03:10 |
|   1 |  SORT ORDER BY                              |                               |     2 |   594 | 15752   (3)| 00:03:10 |
|   2 |   COUNT                                     |                               |       |       |            |          |
|*  3 |    FILTER                                   |                               |       |       |            |          |
|*  4 |     HASH JOIN OUTER                         |                               |     2 |   594 | 15751   (3)| 00:03:10 |
|*  5 |      HASH JOIN OUTER                        |                               |     2 |   562 | 15734   (3)| 00:03:09 |
|*  6 |       HASH JOIN OUTER                       |                               |     2 |   536 |  7909   (3)| 00:01:35 |
|   7 |        NESTED LOOPS                         |                               |     2 |   504 |  7893   (3)| 00:01:35 |
|   8 |         VIEW                                |                               |     1 |    13 |  4152   (3)| 00:00:50 |
|*  9 |          FILTER                             |                               |       |       |            |          |
|  10 |           HASH GROUP BY                     |                               |     1 |   125 |  4152   (3)| 00:00:50 |
|* 11 |            HASH JOIN OUTER                  |                               |  5494 |   670K|  4151   (3)| 00:00:50 |
|  12 |             NESTED LOOPS                    |                               |       |       |            |          |
|  13 |              NESTED LOOPS                   |                               |  3010 |   291K|  3896   (3)| 00:00:47 |
|* 14 |               HASH JOIN                     |                               |   110K|  5949K|  3875   (3)| 00:00:47 |
|* 15 |                TABLE ACCESS FULL            | l0                          |   278 |  8062 |   168   (2)| 00:00:03 |
|  16 |                TABLE ACCESS FULL            | lpp               |  1530K|    37M|  3691   (2)| 00:00:45 |
|* 17 |               INDEX UNIQUE SCAN             | PK_lpi0      |     1 |       |     0   (0)| 00:00:01 |
|* 18 |              TABLE ACCESS BY INDEX ROWID    | lpi0         |     1 |    44 |     0   (0)| 00:00:01 |
|  19 |             TABLE ACCESS FULL               | arda0 |   131K|  3331K|   253   (2)| 00:00:04 |
|  20 |         VIEW PUSHED PREDICATE               |                               |     1 |   239 |  3741   (2)| 00:00:45 |
|  21 |          SORT GROUP BY                      |                               |     1 |   225 |  3741   (2)| 00:00:45 |
|  22 |           NESTED LOOPS OUTER                |                               |     1 |   225 |  3741   (2)| 00:00:45 |
|* 23 |            HASH JOIN OUTER                  |                               |     1 |   209 |  3741   (2)| 00:00:45 |
|  24 |             NESTED LOOPS                    |                               |       |       |            |          |
|  25 |              NESTED LOOPS                   |                               |     1 |   183 |    79   (3)| 00:00:01 |
|  26 |               NESTED LOOPS                  |                               |     4 |   628 |    79   (3)| 00:00:01 |
|  27 |                NESTED LOOPS                 |                               |     1 |   131 |     3   (0)| 00:00:01 |
|  28 |                 NESTED LOOPS                |                               |     1 |    95 |     2   (0)| 00:00:01 |
|  29 |                  TABLE ACCESS BY INDEX ROWID| C_USER_REGIST_INFO            |     1 |    15 |     2   (0)| 00:00:01 |
|* 30 |                   INDEX UNIQUE SCAN         | PK_C_USER_REGIST_INFO         |     1 |       |     1   (0)| 00:00:01 |
|* 31 |                  TABLE ACCESS BY INDEX ROWID| l0                          |     1 |    80 |     0   (0)| 00:00:01 |
|* 32 |                   INDEX UNIQUE SCAN         | PK_l0                       |     1 |       |     0   (0)| 00:00:01 |
|* 33 |                 TABLE ACCESS BY INDEX ROWID | B_APPLY_INFO                  |   203 |  7308 |     1   (0)| 00:00:01 |
|* 34 |                  INDEX UNIQUE SCAN          | PK_B_APPLY_INFO               |     1 |       |     0   (0)| 00:00:01 |
|* 35 |                TABLE ACCESS FULL            | P_BORROWER_PRODUCT            |     4 |   104 |    76   (3)| 00:00:01 |
|* 36 |               INDEX UNIQUE SCAN             | PK_P_PRODUCT                  |     1 |       |     0   (0)| 00:00:01 |
|* 37 |              TABLE ACCESS BY INDEX ROWID    | P_PRODUCT                     |     1 |    26 |     0   (0)| 00:00:01 |
|* 38 |             TABLE ACCESS FULL               | lpp               |   399 | 10374 |  3662   (2)| 00:00:44 |
|  39 |            TABLE ACCESS BY INDEX ROWID      | lpi0         |     1 |    16 |     0   (0)| 00:00:01 |
|* 40 |             INDEX UNIQUE SCAN               | PK_lpi0      |     1 |       |     0   (0)| 00:00:01 |
|* 41 |        TABLE ACCESS FULL                    | TLA_TRANSFER_l0_APPLY       |     2 |    32 |    15   (0)| 00:00:01 |
|  42 |       VIEW                                  |                               |     4 |    52 |  7825   (3)| 00:01:34 |
|* 43 |        HASH JOIN                            |                               |     4 |   208 |  7825   (3)| 00:01:34 |
|  44 |         VIEW                                |                               |     1 |    26 |  4152   (3)| 00:00:50 |
|* 45 |          FILTER                             |                               |       |       |            |          |
|  46 |           HASH GROUP BY                     |                               |     1 |   125 |  4152   (3)| 00:00:50 |
|* 47 |            HASH JOIN OUTER                  |                               |  5494 |   670K|  4151   (3)| 00:00:50 |
|  48 |             NESTED LOOPS                    |                               |       |       |            |          |
|  49 |              NESTED LOOPS                   |                               |  3010 |   291K|  3896   (3)| 00:00:47 |
|* 50 |               HASH JOIN                     |                               |   110K|  5949K|  3875   (3)| 00:00:47 |
|* 51 |                TABLE ACCESS FULL            | l0                          |   278 |  8062 |   168   (2)| 00:00:03 |
|  52 |                TABLE ACCESS FULL            | lpp               |  1530K|    37M|  3691   (2)| 00:00:45 |
|* 53 |               INDEX UNIQUE SCAN             | PK_lpi0      |     1 |       |     0   (0)| 00:00:01 |
|* 54 |              TABLE ACCESS BY INDEX ROWID    | lpi0         |     1 |    44 |     0   (0)| 00:00:01 |
|  55 |             TABLE ACCESS FULL               | arda0 |   131K|  3331K|   253   (2)| 00:00:04 |
|  56 |         TABLE ACCESS FULL                   | lpp               |  1530K|    37M|  3657   (2)| 00:00:44 |
|  57 |      VIEW                                   |                               |    86 |  1376 |    16   (7)| 00:00:01 |
|  58 |       HASH GROUP BY                         |                               |    86 |  2494 |    16   (7)| 00:00:01 |
|* 59 |        TABLE ACCESS FULL                    | TLA_TRANSFER_l0_APPLY       |    86 |  2494 |    15   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("L_TRAN"."TRANSFERABLE" IS NULL OR "L_TRAN"."TRANSFERABLE"<>'1')
   4 - access("L_TRAN"."SELLER_l0_ID"(+)="L_TARGET"."l0ID")
   5 - access("L_PRE"."l0_ID"(+)="L_TARGET"."l0ID")
   6 - access("TLA_TRANSFER_l0_APPLY"."SELLER_l0_ID"(+)="L_TARGET"."l0ID")
   9 - filter(SUM("ARDA0"."REPAYMENT_AMT")=0 OR SUM("ARDA0"."REPAYMENT_AMT") IS NULL)
  11 - access("ARDA0"."id3"(+)="LPI0"."id3")
  14 - access("L2"."l0_ID"="LPP0"."l0_ID")
  15 - filter("L2"."CREDITOR_USER_ID"=5263 AND "L2"."STATUS"<>'2')
  17 - access("LPP0"."id3"="LPI0"."id3")
  18 - filter("LPI0"."PERIOD_START_TIME"<=SYSDATE@! AND "LPI0"."PERIOD_END_TIME">SYSDATE@!)
  23 - access("LPP"."l0_ID"(+)="L0"."l0_ID")
  30 - access("CURI"."I_USER_ID"=5263)
  31 - filter("L0"."CREDITOR_USER_ID"=5263 AND "L0"."flag1"='1' AND "L0"."STATUS"<>'2')
  32 - access("L0"."l0_ID"="L_CUR"."l0_ID")
  33 - filter("BAI"."rate1"=12)
  34 - access("BAI"."I_id1"="L0"."id1")
  35 - filter("PBP0"."id1" IS NOT NULL AND "PBP0"."id1"="L0"."id1")
  36 - access("PBP0"."id2"="PP0"."id2")
  37 - filter("PP0"."PRODUCT_TYPE"=1)
  38 - filter("LPP"."l0_ID"(+)="L_CUR"."l0_ID")
  40 - access("LPI"."id3"(+)="LPP"."id3")
  41 - filter("TRANSFERABLE"(+)='1')
  43 - access("LC"."PERIOD_NUM"="LPP0"."PERIOD"+1 AND "LC"."l0_ID"="LPP0"."l0_ID")
  45 - filter(SUM("ARDA0"."REPAYMENT_AMT")=0 OR SUM("ARDA0"."REPAYMENT_AMT") IS NULL)
  47 - access("ARDA0"."id3"(+)="LPI0"."id3")
  50 - access("L2"."l0_ID"="LPP0"."l0_ID")
  51 - filter("L2"."CREDITOR_USER_ID"=5263 AND "L2"."STATUS"<>'2')
  53 - access("LPP0"."id3"="LPI0"."id3")
  54 - filter("LPI0"."PERIOD_START_TIME"<=SYSDATE@! AND "LPI0"."PERIOD_END_TIME">SYSDATE@!)
  59 - filter("TTLA"."SELLER_ID"=5263)

Note
-----
   - dynamic sampling used for this statement (level=2)
Note
-----
   - dynamic sampling used for this statement (level=2)


Statistics
----------------------------------------------------------
        541  recursive calls
          0  db block gets
    2088099  consistent gets
        234  physical reads
       2264  redo size
      11549  bytes sent via SQL*Net to client
        619  bytes received via SQL*Net from client
         11  SQL*Net roundtrips to/from client
        359  sorts (memory)
          0  sorts (disk)
        147  rows processed

14:51:34
嗯
在lpp表的l0_ID 搞个索引。执行时间大约4秒多

大家仔细比对inner join 与left join里的部分sql,里面实际上是同样的一段语句,只是开发写join的时候同一个表的列一会儿放在前面一会儿放在后面,让我挨个的重写后才能实际确认,太坑了。ok 牢骚发完了,改写后的如下

WITH l_cur AS
 (SELECT l2.l0_id,
         l2.creditor_user_id,
         lpi0.period_num,
         lpi0.period_end_time
    FROM l0 l2
    LEFT JOIN lpp0
      ON l2.l0_id = lpp0.l0_id
    LEFT JOIN lpi0 lpi0
      ON lpp0.id3 = lpi0.id3
    LEFT JOIN arda0
      ON arda0.id3 = lpi0.id3
   WHERE l2.creditor_user_id = 5263
     AND l2.status != '2'
     AND lpi0.period_start_time <= SYSDATE
     AND lpi0.period_end_time > SYSDATE
   GROUP BY l2.l0_id,
            lpi0.period_num,
            l2.creditor_user_id,
            lpi0.period_end_time
  HAVING SUM(arda0.repayment_amt) = 0 OR SUM(arda0.repayment_amt) IS NULL)
SELECT l_target.*, rownum AS rn
  FROM (SELECT l0.l0_id AS l0id,
               l0.date1 AS createdate,
               l0.id1 AS applyid,
               bai.stitle AS applytitle,
               bai.amt1 AS applyamt,
               bai.rate1 AS applyratio,
               l0.value1 AS oripri,
               l0.value2 AS leftamt,
               SUM(CASE
                     WHEN lpi.status != '1' THEN
                      1
                     ELSE
                      0
                   END) AS remperiods,
               l0.flag1 AS flag2,
               curi.s_cnname AS name2,
               curi.i_user_id AS selluserid
          FROM l0
          LEFT JOIN lpp
            ON lpp.l0_id = l0.l0_id
          LEFT JOIN lpi0 lpi
            ON lpi.id3 = lpp.id3
          LEFT JOIN b_apply_info bai
            ON bai.i_id1 = l0.id1
          LEFT JOIN p_borrower_product pbp0
            ON pbp0.id1 = l0.id1
          LEFT JOIN p_product pp0
            ON pbp0.id2 = pp0.id2
         INNER JOIN c_user_regist_info curi
            ON l0.creditor_user_id = curi.i_user_id
         WHERE 1 = 1
           AND l0.creditor_user_id = 5263
           AND l0.status != '2'
           AND l0.flag1 = '1'
           AND pp0.product_type = 1
         GROUP BY l0.l0_id,
                  l0.value1,
                  l0.value2,
                  l0.id1,
                  l0.date1,
                  bai.stitle,
                  bai.amt1,
                  bai.rate1,
                  l0.flag1,
                  curi.s_cnname,
                  curi.i_user_id) l_target
 INNER JOIN l_cur ON l_cur.l0_id = l_target.l0id
  LEFT JOIN (SELECT lpp0.l0_id, lpp0.status, lpp0.period
               FROM lpp0
              INNER JOIN l_cur lc
                 ON lc.l0_id = lpp0.l0_id
              WHERE lc.period_num = lpp0.period + 1) l_pre
    ON l_pre.l0_id = l_target.l0id 
  LEFT JOIN (SELECT ttla.seller_l0_id,
                    COUNT(*) t_cnt,
                    MAX(transferable) transferable
               FROM tla_transfer_l0_apply ttla
              WHERE 1 = 1
                AND ttla.seller_id = 5263
              GROUP BY ttla.seller_l0_id) l_tran
    ON l_tran.seller_l0_id = l_target.l0id 
  LEFT JOIN (SELECT * FROM tla_transfer_l0_apply WHERE transferable = '1') ttla1
    ON ttla1.seller_l0_id = l_target.l0id
 WHERE 1 = 1
   AND (l_tran.transferable IS NULL OR l_tran.transferable != '1')
   AND applyratio = 12
 ORDER BY leftamt DESC;
这个语句优化的效果不算大,只是从4秒到了2秒以内。勉强也算一次优化吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值