sql优化,生产真实案例7

Sql文本:

SELECT  COUNT(1)
FROM    TBLMITEMCCLASS2MITEM M,
        (
        WITH TMP AS
                (
                        SELECT  F.VALUE
                        FROM    TBLPROFILEVALUE F
                        WHERE   F.PROFILECODE = 'MAIN_AND_SUB_PCB_RULE'
                )
        SELECT  REGEXP_SUBSTR(TMP.VALUE, '[^|]+', 1, ROWNUM) VALUE
        FROM    TMP CONNECT BY ROWNUM <= REGEXP_COUNT(TMP.VALUE, '\|') + 1
        )
        TMP,
        TBLBARPRINT T
WHERE   T.BARCODE   = :B2
        AND T.ORGID = :B1
        AND M.ORGID = T.ORGID
        AND T.ORGID
        ||
        ';'
        ||
        M.CONCATENATEDCLASSCODE = TMP.VALUE

在这里插入图片描述

执行1500万次,执行计划如下,对TBLMITEMCCLASS2MITEM全表扫描,cost为181
在这里插入图片描述
造成全表扫描的原因是把两列进行拼接,导致无法用上索引

    AND T.ORGID
    ||
    ';'
    ||
    M.CONCATENATEDCLASSCODE = TMP.VALUE

而且根据package中的内容,这个sql也仅用于判断是否为0,不考虑具体数值
在这里插入图片描述
不明白其中connect by的目的

建议修改为如下,由于对于具体数值无要求,改为取rownum=1,再count,即可判断是否为0
并且根据业务反馈,原有sql其实还缺少关联条件
在这里插入图片描述
造成多对多的关联,其实count的值并不对,原本应该count为0,缺少此条件导致count部位0

修改为如下内容:

SELECT COUNT(*)
  FROM (SELECT 1
          FROM tblmitemcclass2mitem m,
               (                   WITH tmp AS (SELECT f.value
                                                  FROM tblprofilevalue f
                                                 WHERE f.profilecode =
                                                       'MAIN_AND_SUB_PCB_RULE')
                 SELECT regexp_substr(tmp.value,
                                      '[^|]+',
                                      1,
                                      rownum) VALUE
                   FROM tmp
                 CONNECT BY rownum <= regexp_count(tmp.value,
                                                   '\|') + 1) tmp, tblbarprint t
                  WHERE t.barcode = &b2
                    AND t.orgid = &b1
                    AND m.orgid = t.orgid
                    AND m.mitemcode = t.itemcode
                    AND t.orgid || ';' || m.concatenatedclasscode = tmp.value
                    AND rownum = 1
        )

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dba任意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值