One sql performance tuning

Original sql:

select *
  from ((select count(c.customer_id) day30
           from customer c
          where c.is_active = '0'
            and c.birth IN (SELECT to_char(SYSDATE - 1 + rownum, 'mm-dd')
                              FROM dual
                            CONNECT BY rownum <= 30)
            AND exists (SELECT 1
                   FROM sid_view v
                  WHERE v.object_id_identity = c.customer_id
                    AND v.class =
                        '##########################'    /* sensitivity information */
                    and v.ACE_SID in (:1, :2))) a left join
        (select count(c.customer_id) tomorrow
           from customer c
          where c.is_active = '0'
            and c.birth = to_char(sysdate + 1, 'mm-dd')
            AND exists (SELECT 1
                   FROM sid_view v
                  WHERE v.object_id_identity = c.customer_id
                    AND v.class =
                        '##########################'
                    and v.ACE_SID in (:3, :4))) b on 1 = 1 left join
        (select count(c.customer_id) today
           from customer c
          where c.is_active = '0'
            and c.birth = to_char(sysdate, 'mm-dd')
            AND exists (SELECT 1
                   FROM sid_view v
                  WHERE v.object_id_identity = c.customer_id
                    AND v.class =
                        '##########################'
                    and v.ACE_SID in (:5, :6))) on 1 = 1)

I known that v.ace_sid in ( value, value) being same by communicating with programer, therefore i extracted the global temp table as the sql_tmp

eg:

WITH sql_tmp AS
 (SELECT c.customer_id, C.BIRTH 
    FROM customer c
   WHERE c.is_active = '0'
     AND c.birth IN (SELECT TO_CHAR(sysdate - 1 + rownum, 'mm-dd')
                       FROM dual
                     CONNECT BY rownum <= 30)
     AND EXISTS
   (SELECT 1
            FROM sid_view v
           WHERE v.object_id_identity = c.customer_id
             AND v.class = '#######################'
             AND V.ACE_SID IN (:1, :2)))
SELECT *
  FROM (SELECT COUNT(T.CUSTOMER_ID) DAY30 FROM SQL_TMP t)
  LEFT JOIN (SELECT COUNT(T.CUSTOMER_ID) TOMORROW
               FROM SQL_TMP T
              WHERE t.BIRTH = TO_CHAR(SYSDATE + 1, 'mm-dd' ) )
    ON 1 = 1
  LEFT JOIN (SELECT COUNT(t.customer_id) today FROM sql_tmp t 
       WHERE t.birth = to_char(sysdate, 'mm-dd'))
    ON 1 = 1;




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值