ORACLE UNION ALL 与UNION 性能问题现象:
一个存储过程用到了UNION ALL 或者 UNION 造成系统界面卡死
系统使用一周之后,就卡死了,把UNION ALL 改成 UNION 一下子就执行过去。再过一周又卡死了,又把UNION 改成UNION ALL又一下子执行过去了。此问题频繁出现现在,
暂时处理方案:修改存储过程,UNION ALL与UNION 两者之前进行切换。造成此问题是什么原因呀。有什么解决方案呀。。
一个存储过程用到了UNION ALL 或者 UNION 造成系统界面卡死
系统使用一周之后,就卡死了,把UNION ALL 改成 UNION 一下子就执行过去。再过一周又卡死了,又把UNION 改成UNION ALL又一下子执行过去了。此问题频繁出现现在,
暂时处理方案:修改存储过程,UNION ALL与UNION 两者之前进行切换。造成此问题是什么原因呀。有什么解决方案呀。。
怀疑你的sql逻辑写的有问题
FROM (SELECT MIN(ETD_TIME) AS DATE_TIME_FROM,
MAX(ETD_TIME) AS DATE_TIME_TO,
'ETD_TIME' AS TIME_TYPE
FROM (SELECT CSC.ETD_TIME AS ETD_TIME, 'SE' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SE_MANIFEST CSM
ON CSM.BL_NO_ID = SF.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = CSM.VOYAGE_ID
WHERE SF.SYSTEM_NO = 'SE'
UNION ALL
SELECT CSC.ETD_TIME AS ETD_TIME, 'SI' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SI_MANIFEST CSM
ON CSM.BL_ID = SF.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'SI'
UNION ALL
SELECT CSC.ETD_TIME AS ETD_TIME, 'HU' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'HU'
UNION ALL
SELECT CBH.IE_DATE AS ETD_TIME, 'BK' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_BK_HEADER CBH
ON CBH.BK_HEADER_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'BK'
UNION ALL
SELECT CBR.ETD_TIME AS ETD_TIME, 'BKR' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_BK_REASSIGN CBR
ON CBR.BK_REASSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'BK')) A;
SELECT DATE_TIME_FROM, DATE_TIME_TO
FROM (SELECT MIN(ETD_TIME) AS DATE_TIME_FROM,
MAX(ETD_TIME) AS DATE_TIME_TO,
'ETD_TIME' AS TIME_TYPE
FROM (SELECT CSC.ETD_TIME AS ETD_TIME, 'SE' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SE_MANIFEST CSM
ON CSM.BL_NO_ID = SF.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = CSM.VOYAGE_ID
WHERE SF.SYSTEM_NO = 'SE'
UNION ALL
SELECT CSC.ETD_TIME AS ETD_TIME, 'SI' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SI_MANIFEST CSM
ON CSM.BL_ID = SF.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'SI'
UNION ALL
SELECT CSC.ETD_TIME AS ETD_TIME, 'HU' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'HU'
UNION ALL
SELECT CBH.IE_DATE AS ETD_TIME, 'BK' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_BK_HEADER CBH
ON CBH.BK_HEADER_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'BK'
UNION ALL
SELECT CBR.ETD_TIME AS ETD_TIME, 'BKR' AS SYSTEM_NO
FROM RP_ALLOCATION_EVENT RAE
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN CA_BK_REASSIGN CBR
ON CBR.BK_REASSIGN_ID = SF.JOB_ORDER_ID
WHERE SF.SYSTEM_NO = 'BK')) A;
现在用 了UNION ALL反而更慢,改成UNION 反而更快。
慢的时候我修改存储过程的UNION ALL 成UNION 就快
(SELECT SF.JOB_ORDER_ID
FROM RP_ALLOCATION_EVENT RAE
JOIN RP_ALLOCATION_DETAIL RAD
ON RAD.ALLOCATION_EVENT_ID = RAE.ALLOCATION_EVENT_ID
JOIN RP_LEDGER_ITEM RLI
ON RLI.LEDGER_ITEM_ID = RAD.LEDGER_ITEM_ID
JOIN SZ_FREIGHT SF
ON SF.FREIGHT_ID = RLI.SOURCE_ID
JOIN TMP_QUERY TMP
ON TMP.JOB_ORDER_ID = RAE.ALLOCATION_EVENT_ID)
SELECT MIN(ETD_TIME) AS DATE_TIME_FROM,
MAX(ETD_TIME) AS DATE_TIME_TO
FROM ((SELECT CSC.ETD_TIME
FROM A
JOIN CA_SI_MANIFEST CSM
ON CSM.BL_ID = A.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = CSM.VOYAGE_ID) UNION ALL
(SELECT CSC.ETD_TIME
FROM A
JOIN CA_SI_MANIFEST CSM
ON CSM.BL_ID = A.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = CSM.VOYAGE_ID) UNION ALL
(SELECT CSC.ETD_TIME
FROM A
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = A.JOB_ORDER_ID) UNION ALL
(SELECT CBH.IE_DATE AS ETD_TIME
FROM A
JOIN CA_BK_HEADER CBH
ON CBH.BK_HEADER_ID = A.JOB_ORDER_ID) UNION ALL
(SELECT CBR.ETD_TIME AS ETD_TIME
FROM A
JOIN CA_BK_REASSIGN CBR
ON CBR.BK_REASSIGN_ID = A.JOB_ORDER_ID) UNION ALL
(SELECT CSC.ETD_TIME
FROM A
JOIN CA_SE_MANIFEST CSM
ON CSM.BL_NO_ID = A.JOB_ORDER_ID
JOIN CA_SH_CONSIGNMENT CSC
ON CSC.CONSIGN_ID = CSM.VOYAGE_ID));
END;
就不觉得维护都很难维护吗?
瞎搞!
为什么会造成UNION ALL 改成UNION 后性能突然加快。系统运行一个时间后又突然变慢,改回原来的UNION ALL又变快了。
造成上面问题的原因主要有哪些。
表设计是不可能动的了。表的索引都是有建的。
为什么会造成UNION ALL 改成UNION 后性能突然加快。系统运行一个时间后又突然会卡死,改回原来的UNION ALL又变快了。
造成上面问题的原因主要有哪些。
看你说的情况,应该和这个关系不大。
看样子像是DB间歇性的井喷,在哪本书上看到过这样例子,忘记了,明天找找看~