【in - exists-join(distinct)】SQL调优改写一例

本文通过一个实际案例,详细介绍了如何对包含`in - exists-join(distinct)`的SQL进行调优。通过SQL拆分、改写及增加执行计划提示,成功将查询时间从超过10分钟降低到5秒以内,显著提升了查询效率。
摘要由CSDN通过智能技术生成

相关数据已经脱敏处理

原SQL

MERGE INTO IntoTable t USING (
    SELECT
        x.PID,
        b.SEC_ID,
        b.T_SYB,
        b.E_CD,
        x.END_DATE,
        x.xh 区间级别,
        isnull(x.hj, 0) 区间人数
    FROM
        (
            SELECT
                a.PID,
                a.END_DATE,
                a.xh,
                c.hj
            FROM
                (
                    SELECT
                        PID,
                        END_DATE,
                        row_number () OVER (
                            PARTITION BY PID,
                            END_DATE
                        ORDER BY
                            END_DATE
                        ) xh
                    FROM
                        ScTable a
                    WHERE
                        EXISTS (
                            SELECT
                                *
                            FROM
                                (
                                    SELECT
                                        PID,
                                        END_DATE,
                                        COUNT(*) hj
                                    FROM
                                        ScTable
                                    GROUP BY
                                        PID,
                                        END_DATE
                                    HAVING
                                        COUNT(*) >= 5
                                ) b
                            WHERE
                                a.PID = b.PID
                            AND a.END_DATE = b.END_DATE
                        )
                    AND EXISTS (
                        SELECT
                            *
                        FROM
                            ScTable c
                        WHERE
                            UPDATE_TIME >= CONVERT (VARCHAR(20), GETDATE() - 1, 23)
                        AND R_TYPE = '5'
                        AND a.PID = c.PID
                        AND a.END_DATE = c.END_DATE
                    )
                    AND a.DR = '1'
                ) a
            LEFT JOIN (
                SELECT
                    PID,
                    END_DATE,
                    jb,
                    COUNT(*) hj
                FROM
                    (
                        SELECT
                            PID,
                            END_DATE,
                            mm,
                            CASE
                        WHEN mm >= 0
                        AND mm <= 200000 THEN
                            5
                        WHEN mm > 200000
                        AND mm <= 500000 THEN
                            4
                        WHEN mm > 500000
                        AND mm <= 1000000 THEN
                            3
                        WHEN mm > 1000000
                        AND mm <= 2000000 THEN
                            2
                        WHEN mm > 2000000 THEN
                            1
                        END jb
                        FROM
                            (
                                SELECT
                                    PID,
                                    END_DATE,
                                    CASE
                                WHEN A_REWARD IS NULL THEN
                                    0
                                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值