Нужен альтернативный подход для выполнения запроса SQL в цикле - PullRequest
0 голосов
/ 24 марта 2020

Проблема: Одно из требований моего клиента - получать заказы от клиента (хранящиеся в таблице 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

...