2016-08-03 9 views
0

productテーブル(1番目の選択)から製品の説明を取得するクエリがあり、次にそれを次のサブクエリステートメントに減算してnoを取得します。残りの株式の:(2)inventoryテーブルで購入各製品の複数のサブクエリ結合によるクエリの最適化

-sum sales_detailテーブル(3)で販売されている各製品、各製品の

-sumの

-sumを別に移しstock_transferテーブル内のブランチ(4)(第5回)damaged_productテーブルに破損してしまった各製品の

-sumは

問題は毎回のTHIですクエリがロードされると、すべての4つのテーブルを完全に検索してquantity列の合計を取得します。時間の経過とともに、より多くのレコードが保存され、クエリが遅くなります。助言がありますか?

SELECT p.Id,p.Product_Name Product,p.Description, c.Category_Name Category,sc.Subcategory_Name Subcategory,s.Supplier_Name Supplier, p.Selling_Price `Unit Price`,i.Stocks,s.Sales, i.Stocks - IFNULL(s.Sales, 0) - IFNULL(t.Transfer, 0) - IFNULL(d.Damage, 0) AS Remaining 

FROM (SELECT Id, Product_Name, Description, Selling_Price, Category_Id, Subcategory_Id, Supplier_Id  FROM product WHERE enable_flag = 1) p 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Stocks 
       FROM inventory 
       WHERE enable_flag = 1 GROUP BY product_id) i ON p.Id = i.product_id 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(quantity), 0) AS Sales 
       FROM sales_detail 
       WHERE enable_flag = 1 GROUP BY product_id) s USING(product_id) 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(transfer_quantity), 0) AS Transfer 
       FROM stock_transfer 
       WHERE enable_flag = 1 GROUP BY product_id) t USING(product_id) 

LEFT OUTER JOIN(SELECT product_id, COALESCE(SUM(damaged_quantity), 0) AS Damage 
       FROM damaged_product 
       WHERE enable_flag = 1 GROUP BY product_id) d USING(product_id) 

JOIN Category c ON p.Category_Id=c.Id 

JOIN Subcategory sc ON p.Subcategory_Id=sc.Id 

JOIN Supplier s ON p.Supplier_Id=s.Id; 

答えて

2

サブクエリを使用すると、インデックスの使用が妨げられ、クエリが遅くなる可能性があります。私はこのようなクエリを示唆している:

SELECT p.*, sc.Subcategory_Name as Subcategory, s.Supplier_Name as Supplier, 
     p.Selling_Price as `Unit Price`, 
     (SELECT COALESCE(SUM(quantity), 0) 
     FROM inventory i 
     WHERE s.enable_flag = 1 AND s.product_id = p.product_id 
     ) as stocks, 
     (SELECT COALESCE(SUM(quantity), 0) 
     FROM sales_detail sd 
     WHERE i.enable_flag = 1 AND i.product_id = p.product_id 
     ) as sales, 
     (SELECT COALESCE(SUM(tansferquantity), 0) 
     FROM stock_transfer st 
     WHERE st.enable_flag = 1 AND st.product_id = p.product_id 
     ) as transfers, 
     (SELECT COALESCE(SUM(damaged_quantity), 0) 
     FROM damage d 
     WHERE d.enable_flag = 1 AND d.product_id = p.product_id 
     ) as damaged 
FROM product p JOIN 
    Category c 
    ON p.Category_Id = c.Id JOIN 
    Subcategory sc 
    ON p.Subcategory_Id = sc.Id JOIN 
    Supplier s 
    ON p.Supplier_Id = s.Id 
WHERE p.enable_flag = 1; 

パフォーマンスを得るために、基礎となるテーブルは(product_id, enable_flag, quantity)のインデックスをしたいです。 MySQLは相関サブクエリの集約にインデックスを使用できます。

私はあなたも計算値を持っていることを認識しています。サブクエリの追加マテリアライゼーションのヒットを受け、外部クエリでこれらの計算を行う必要があります。

+0

ヒント@Gordon Linoffありがとう!私はこれを試し、テストが終わったらそれを受け入れてタグ付けします –

関連する問題