Проблема: Одно из требований моего клиента - получать заказы от клиента (хранящиеся в таблице txnorder) и генерировать с них упаковочные листы (хранящиеся в таблице txnpackingslip). Теперь иногда упаковывается больше товаров, чем заказано, что не является проблемой, проблема возникает, когда мне нужно сгенерировать отчет по упаковке больше, чем заказ (упоминается как отрицательные заказы). Количество клиентов превышает 1400, ежедневно обновляется более 300 строк в таблице txnorder и более 250 строк в таблице txnpacking slip. MySQL сервер централизован на веб-хостинге.
Что я сделал: Я уже написал хранимую процедуру, как показано ниже, но с централизованным сервером она занимает больше 90 секунд для извлечения результатов, в то время как количество строк в таблице заказов равно 1600 и packinslip 1400
Хранимая процедура: `
CREATE DEFINER=`root`@`localhost` PROCEDURE `NegativeOrders`(
IN pcinput INT
)
BEGIN
SELECT
DISTINCT(o.ocode) AS "Code",
o.opcode, (o.obdl - IFNULL(p.pbdl,0)) AS "Req_Bdl",
(o.obox - IFNULL(p.pbox,0)) AS "Req_Box"
FROM
(SELECT DISTINCT(orderprdcode) AS ocode,
orderpartycode AS opcode, (SUM(orderbdl)) AS obdl,
(SUM(orderbox)) AS obox
FROM txnorder WHERE orderpartycode = pcinput
GROUP BY orderprdcode) o
LEFT JOIN
(SELECT DISTINCT(packprodcode) AS pcode,
packpartycode AS ppcode,
(SUM(packbdl)) AS pbdl,
(SUM(packbox)) AS pbox
FROM txnpackingslip WHERE packpartycode = pcinput
GROUP BY packprodcode) p
ON o.ocode = p.pcode
GROUP BY o.ocode
HAVING req_bdl < 0 OR req_box < 0;
END$$
DELIMITER ;
Это SQL Fiddle Created : NegativeOrderFiddle
Примечание: Я открыт для адаптации любого подходящего подхода, кроме оптимизации моего SQL