我遇到了以下查询的性能问题,我想获取有关销售线和每条销售线的一些信息我想查明库存中收到的最后一个日期:查询子查询执行可怕
SELECT XAL_SUPERVISOR.SALESTABLE.SALESNUMBER, XAL_SUPERVISOR.SALESTABLE.DEBTORACCOUNT, XAL_SUPERVISOR.SALESTABLE.DELIVERYNAME,
XAL_SUPERVISOR.SALESTABLE.DELIVERYADDRESS3, XAL_SUPERVISOR.SALESTABLE.REQUISNUMBER, XAL_SUPERVISOR.SALESTABLE.CUSTOMERREF,
XAL_SUPERVISOR.SALESTABLE.ROUTE, XAL_SUPERVISOR.SALESTABLE.ROUTENUMBER, XAL_SUPERVISOR.SALESTABLE.CMPVWSTATUS,
XAL_SUPERVISOR.SALESTABLE.CMPLOGISTIEK, XAL_SUPERVISOR.SALESTABLE.USVEHICLE, XAL_SUPERVISOR.SALESTABLE.ELCSALSTCALL,
XAL_SUPERVISOR.SALESTABLE.ELCSALSTOK, XAL_SUPERVISOR.SALESTABLE.ELCEDICODE, XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER,
XAL_SUPERVISOR.STOCKTABLE.ITEMNAME, XAL_SUPERVISOR.SALESTRANS.QTYORDERED, XAL_SUPERVISOR.SALESTRANS.STOCKLOC AS REGELLOC,
XAL_SUPERVISOR.STOCKTABLE.STOCKLOC AS STDLOC, XAL_SUPERVISOR.SALESTABLE.DELIVERYDATE, XAL_SUPERVISOR.SALESTABLE.DATASET,
XAL_SUPERVISOR.SALESTABLE.CMPCORRECTIE, XAL_SUPERVISOR.SALESTRANS.ELCORGQTYORDERED AS ORG_BESTELD,
XAL_SUPERVISOR.STOCKTABLE.CMPVERVALLEN,
(SELECT (SUM(STS.ENTEREDQTY) + SUM(STS.RECEIVED) - SUM(STS.DRAWN))
FROM XAL_SUPERVISOR.STOCKSUM STS
WHERE STS.ITEMNUMBER = XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER AND STS.DATASET = 'CMP'
GROUP BY STS.ITEMNUMBER) AS VOORRAAD,
(SELECT SUM(STS.ORDERED)
FROM XAL_SUPERVISOR.STOCKSUM STS
WHERE STS.ITEMNUMBER = XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER AND STS.DATASET = 'CMP'
GROUP BY STS.ITEMNUMBER) AS BESTELD,
(SELECT SUM(STS.RESERVPHYSICAL)
FROM XAL_SUPERVISOR.STOCKSUM STS
WHERE STS.ITEMNUMBER = XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER AND STS.DATASET = 'CMP'
GROUP BY STS.ITEMNUMBER) AS GERESERVEERD,
(SELECT DDT.QTY
FROM XAL_SUPERVISOR.DEBDLVTRANS DDT
WHERE DDT.TRANSID = XAL_SUPERVISOR.SALESTRANS.TRANSID AND DDT.DATASET = 'CMP') AS PAKBONAANTAL,
(SELECT DIT.QTY
FROM XAL_SUPERVISOR.DEBINVTRANS DIT
WHERE DIT.TRANSID = XAL_SUPERVISOR.SALESTRANS.TRANSID AND DIT.DATASET = 'CMP') AS FACTUURAANTAL,
(SELECT MAX(ST.DATEPHYSICAL)
FROM XAL_SUPERVISOR.STOCKTRANS ST
WHERE ST.ITEMNUMBER = XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER AND ST.DATASET = 'CMP' AND ST.StatusInFlow < 3 AND ST.DCType = 2)
AS LTSTGELEVERD
FROM XAL_SUPERVISOR.SALESTABLE, XAL_SUPERVISOR.SALESTRANS, XAL_SUPERVISOR.STOCKTABLE
WHERE XAL_SUPERVISOR.SALESTABLE.DATASET = XAL_SUPERVISOR.SALESTRANS.DATASET AND
XAL_SUPERVISOR.SALESTABLE.SALESNUMBER = XAL_SUPERVISOR.SALESTRANS.SALESNUMBER AND
XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER = XAL_SUPERVISOR.STOCKTABLE.ITEMNUMBER AND
XAL_SUPERVISOR.SALESTRANS.DATASET = XAL_SUPERVISOR.STOCKTABLE.DATASET AND (XAL_SUPERVISOR.SALESTABLE.DELIVERYDATE = :Leverdatum) AND
(XAL_SUPERVISOR.SALESTABLE.DATASET = 'CMP') AND (XAL_SUPERVISOR.SALESTABLE.CMPCORRECTIE = 0)
这部分减缓下来(没有它,它在<运行10秒钟):
(SELECT MAX(ST.DATEPHYSICAL)
FROM XAL_SUPERVISOR.STOCKTRANS ST
WHERE ST.ITEMNUMBER = XAL_SUPERVISOR.SALESTRANS.ITEMNUMBER AND ST.DATASET = 'CMP' AND ST.StatusInFlow < 3 AND ST.DCType = 2)
AS LTSTGELEVERD
当我运行在SQL再加上我看到它取主查询,然后停顿了很长一段时间获取上述子查询?
检查你的表'STOCKTRANS'是否被正确索引 – 2013-04-11 15:46:35
有些顾问通过调整其他人的shonky代码来做出非常好的生活。如果仅仅是简单地看待一个查询并且说“在那里改变那条线”,他们不能收取太多的费用。有很多因素可能会导致糟糕的表现。数据量,数据倾斜,磁盘损坏,内存不足,内存不足,失效统计信息,缺少索引,索引错误,磁盘排序。写得不好的SQL只是其中的一件事情。 – APC 2013-04-11 15:54:27
正如@Majid所说:检查是否有正确的索引以及查询计划是否实际使用它们。 – mzedeler 2013-04-11 18:15:36