注册

达梦循环内插入新数据,继续循环,执行效率比oracle慢得多

哎呦喂 2021/01/25 2475 4

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server x64 V8.1.0.147-Build(2019.03.27-104581)ENT
DB Version: 0x7000a
【操作系统】:
【CPU】:AMD R7 3750H
【问题描述】*:达梦循环内插入新数据,继续循环,执行效率比oracle慢得多,oracle执行不到1秒,达梦需要几分钟才能执行完
代码
LOOP
for hy_loop in
(
SELECT
D.LIST_ID ,
D.CONCODE ,
D.CON_DEVID ,
D.CON_TERMINALNAME ,
D.CON_STATION_NO ,
D.CON_DEVTYPE ,
D.CON_BASEVOLTAGEID ,
D.CON_DEV_STATUS ,
D.CON_DEV_LOAD_VALUE,
D.UP_LIST_ID
FROM
TEMP_TOP_LIST_FOR_NK D
WHERE
D.LIST_INDEX = V_INDEX
AND D.LIST_STATUS = ‘N’
AND D.USER_ID = V_USER_ID
AND D.USER_TIME = V_USER_TIME
)
LOOP

                    select
                            hy_loop.LIST_ID           ,
                            hy_loop.CONCODE           ,
                            hy_loop.CON_DEVID         ,
                            hy_loop.CON_TERMINALNAME  ,
                            hy_loop.CON_STATION_NO    ,
                            hy_loop.CON_DEVTYPE       ,
                            hy_loop.CON_BASEVOLTAGEID ,
                            hy_loop.CON_DEV_STATUS    ,
                            hy_loop.CON_DEV_LOAD_VALUE,
                            hy_loop.UP_LIST_ID
                    INTO
                            V_LIST_ID           ,
                            V_CONCODE           ,
                            V_CON_DEVID         ,
                            V_CON_TERMINALNAME  ,
                            V_CON_STATION_NO    ,
                            V_CON_DEVTYPE       ,
                            V_CON_BASEVOLTAGEID ,
                            V_CON_DEV_STATUS    ,
                            V_CON_DEV_LOAD_VALUE,
                            V_UP_LIST_ID
                    from
                            dual;
                    --EXIT WHEN C_SQL_LIST%NOTFOUND;
                    V_R := 13;
                    V_E:=SYSDATE;
                    --V_RESULT:=1;
                    --P_PUB_RUNNING_LOG(V_S, V_E, 'AS2_NK_GET_110BS_BY_TF', (V_E - V_S) * 86400, V_R);
                    --V_S:=SYSDATE;
                            INSERT
                            INTO
                                    TEMP_TOP_LIST_FOR_NK
                                    (
                                            LIST_ID          ,
                                            USER_ID          ,
                                            USER_TIME        ,
                                            CONCODE          ,
                                            CON_DEVID        ,
                                            CON_TERMINALNAME ,
                                            CON_STATION_NO   ,
                                            CON_DEVTYPE      ,
                                            CON_BASEVOLTAGEID,
                                            UP_LIST_ID       ,
                                            UP_CON_DEVID     ,
                                            LIST_INDEX       ,
                                            LIST_STATUS
                                    )
                            SELECT
                                    SQ_DEVICE_TOP_ID.NEXTVAL,
                                    V_USER_ID               ,
                                    V_USER_TIME             ,
                                    E.C1232_TERMINALID      ,
                                    E.C1211_DEVID           ,
                                    E.C1232_TERMINALNAME    ,
                                    T.C0003_STATION_NO      ,
                                    T.C1216_DEVTYPE         ,
                                    V.C0016_BASEVOLTAGEID   ,
                                    D.LIST_ID               ,
                                    D.CON_DEVID             ,
                                    V_INDEX + 1             ,
                                    'N'
                            FROM
                                    TEMP_TOP_LIST_FOR_NK D,
                                    T1233_CNCTRELA A      ,
                                    T1233_CNCTRELA B      ,
                                    T1232_TERMINAL C      ,
                                    T1232_TERMINAL E      ,
                                    T1211_DEVICE T        ,
                                    T0015_VOLTAGELEVEL V
                            WHERE
                                    D.LIST_ID = V_LIST_ID
                                AND A.C1232_TERMINALID = D.CONCODE
                                AND A.C1233_CNCTNODEID = B.C1233_CNCTNODEID
                                AND B.C1232_TERMINALID = C.C1232_TERMINALID
                                AND C.C1232_TERMINALID != A.C1232_TERMINALID
                                AND C.C1211_DEVID = E.C1211_DEVID
                                AND C.C1232_TERMINALID != E.C1232_TERMINALID
                                AND E.C1211_DEVID = T.C1211_DEVID
                                AND T.C0015_VOLTAGELEVELID = V.C0015_VOLTAGELEVELID(+)
                                AND INSTR(E.C1232_TERMINALNAME, 'N') = 0
                                    --AND INSTR(T.C1211_DEVDESC, '地刀') = 0
                                    --AND INSTR(T.C1211_DEVDESC, 'PT') = 0;
                                AND INSTR(T.C1211_DEVDESC, '接地刀闸') = 0
                                and INSTR(T.C1211_DEVDESC, '-')=0
                                and INSTR(T.C1211_DEVDESC, 'X')=0
                                and INSTR(T.C1211_DEVDESC, '-')=0
                                and INSTR(T.C1211_DEVDESC, '×')=0;
                    ELSE
                            --如果下一拓扑没有数据,则删除该节点及父节点只有一个节点的
                            UPDATE
                                    TEMP_TOP_LIST_FOR_NK T
                            SET
                                    T.LIST_STATUS = 'S'
                            WHERE
                                    T.LIST_ID = V_LIST_ID;
                            COMMIT;
                            CONTINUE;

COMMIT;
END LOOP;
V_R := 3;
V_E:=SYSDATE;
–V_RESULT:=1;
P_PUB_RUNNING_LOG(V_S, V_E, ‘AS2_NK_GET_110BS_BY_TF-loop2-e’, (V_E - V_S) * 86400, V_R);
–V_S:=SYSDATE;
V_R := 34;
V_E:=SYSDATE;
–V_RESULT:=1;
–P_PUB_RUNNING_LOG(V_S, V_E, ‘AS2_NK_GET_110BS_BY_TF’, (V_E - V_S) * 86400, V_R);
–V_S:=SYSDATE;
SELECT
COUNT(1)
INTO
V_NUM
FROM
TEMP_TOP_LIST_FOR_NK D
WHERE
D.LIST_STATUS = ‘N’
AND D.LIST_INDEX = V_INDEX;
EXIT
WHEN V_NUM = 0;
V_R := 38;
V_E:=SYSDATE;
–V_RESULT:=1;
– P_PUB_RUNNING_LOG(V_S, V_E, ‘AS2_NK_GET_110BS_BY_TF’, (V_E - V_S) * 86400, V_R);
----V_S:=SYSDATE;
V_INDEX := V_INDEX + 1;
END LOOP;

回答 0
暂无回答
扫一扫
联系客服