Наличие на складе Производительность Mysql - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь получить значение доступного запаса в MYSQL, но когда число строк превышает 35000 , запрос не выполняется без ответа.Я использую подзапросы для извлечения значения доступного запаса.

Вот мой код:

    SELECT
        p.`product-id` AS id,
        p.`product-id` AS product_id,
        ped.purchase_entry_id AS purchase_id,
        p.`product-name` AS name,
        m.name AS manufacturer,
        p.`product-type` AS product_type,
        ped.id AS batch_no,
        ped.internal_sales_rate AS barcode,
        c.name as category,
        ped.size AS size,
        IFNULL(ped.sales_rate,0) AS sales_rate,
        IFNULL(ped.purchase_rate,0) AS purchase_rate,
        IFNULL(SUM(ped.units),0) AS units_purchased,
        (select IFNULL(SUM(sed.qty),0) FROM sales_entry_details sed WHERE (sed.batch_no = ped.id)) AS units_sold,
        (select IFNULL(SUM(sr.qty),0) FROM sales_return_item sr WHERE (sr.batch_no = ped.id)) AS retured,
        (select IFNULL(SUM(pri.qty),0) FROM purchase_return_items pri WHERE (pri.batch_no = ped.id)) AS purchase_return,
        (select IFNULL(SUM(ast.qty),0) FROM adjustment_stock ast WHERE (ast.batch_no = ped.id)) AS adjustment,
        (select IFNULL(SUM(ast2.batch_no),0) FROM adjustment_stock ast2 WHERE (ast2.batch_no = ped.id)) AS isChecked
    FROM purchase_entry_details ped 
        LEFT JOIN products p on p.`product-id` = ped.product_id
        LEFT JOIN category c ON c.id = p.`product-type`
        LEFT JOIN manufacturer m ON m.id = p.manufacturer
    GROUP BY ped.id;

Есть ли лучший вариант для извлечения значения запаса, доступного в SQL ??

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Запрос выглядит нормально.Поскольку нет никаких ограничивающих критериев (без условия WHERE), вы будете читать всю таблицу последовательно.

Конечно, вы хотите, чтобы индексы на batch_no во всех задействованных таблицах.Но я предполагаю, что это внешние ключи для некоторой таблицы пакетов, поэтому индексы уже должны существовать.

Единственное, что я замечаю, это то, что вы выбираете из adjustment_stock дважды.Вы можете избежать этого, переместив подзапросы в ваше предложение FROM:

SELECT
  p.`product-id` AS id,
  p.`product-id` AS product_id,
  ped.purchase_entry_id AS purchase_id,
  p.`product-name` AS name,
  m.name AS manufacturer,
  p.`product-type` AS product_type,
  ped.id AS batch_no,
  ped.internal_sales_rate AS barcode,
  c.name as category,
  ped.size AS size,
  IFNULL(ped.sales_rate,0) AS sales_rate,
  IFNULL(ped.purchase_rate,0) AS purchase_rate,
  IFNULL(SUM(ped.units),0) AS units_purchased,
  IFNULL(sed.sum_qty),0) AS units_sold,
  IFNULL(sr.sum_qty),0) AS retured,
  IFNULL(pri.sum_qty),0) AS retured,
  IFNULL(ast.sum_qty),0) AS adjustment,
  IFNULL(ast.sum_batch_no),0) AS isChecked
FROM purchase_entry_details ped 
LEFT JOIN products p on p.`product-id` = ped.product_id
LEFT JOIN category c ON c.id = p.`product-type`
LEFT JOIN manufacturer m ON m.id = p.manufacturer
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from sales_entry_details group by batch_no
) sed on sed.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from sales_return_item group by batch_no
) sr on sr.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty from purchase_return_items group by batch_no
) pri on pri.batch_no = ped.id
LEFT JOIN
(
  select batch_no, sum(qty) as sum_qty, sum(batch_no) as sum_batch_no
  from adjustment_stock group by batch_no
) ast on ast.batch_no = ped.id
GROUP BY ped.id;

(хотя добавление номеров партий кажется немного странным.)

0 голосов
/ 26 апреля 2018

Вы можете сделать отдельные объединения для каждой таблицы, используемой в подзапросах к таблице purchase_entry_details. Во всех этих отдельных выборках сделайте группу по ped.id. После этого сделайте левое присоединение к новым таблицам с суммами.

 SELECT
        ...

        SED.sumqty,
        SR.sumqty,

        ...

    FROM purchase_entry_details ped 

        LEFT JOIN products p on p.`product-id` = ped.product_id
        LEFT JOIN category c ON c.id = p.`product-type`
        LEFT JOIN manufacturer m ON m.id = p.manufacturer

        LEFT JOIN (
            SELECT ped1.id, SUM(sed1.qty) as sumqty 
            FROM purchase_entry_details ped1 
            JOIN sales_entry_details sed1 ON sed1.batch_no = ped1.id
            GROUP BY ped1.id
            ) SED ON SED.id = ped.id

        LEFT JOIN (
            SELECT ped1.id, SUM(sr1.qty) as sumqty
            FROM purchase_entry_details ped1 
            JOIN sales_return_item sr1 ON sr1.batch_no = ped1.id
            GROUP BY ped1.id
            ) SR ON SR.id = ped.id

            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...