为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【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;
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 = ?
AND D.LIST_STATUS = ‘N’
AND D.USER_ID = ?
AND D.USER_TIME = ?
–这个语句看看执行计划
里面的insert后面的select语句也看看执行计划,update语句也看看执行计划。
也可以在云适配里面申请一个云数据库把数据弄进去,联系我们的同事一起分析
这时间相差太大了,一般是某些操作或者设置没弄;
建索引了吗?