2016-08-11 15 views
2

私は以下に示すクエリを持っています。私の疑いは、レコードの取得時間に関するものです。この方法よりもレコードを取得する方法はありますか?選択クエリの実行時間を短縮する方法

select product_code,product_name,price,taxPercentage,discount_type,discount_amount,prof it_type,profit_amount,purchase_code, qty 
from (
    select distinct p.product_code,p.product_name,pid.price,t.percentage as  taxPercentage,p.discount_type,p.discount_amount,p.profit_type,p.profit_amount, 
    pu.purchase_code,pid.quantity+isnull(sum(sri.quantity),0) -isnull(sum(si.quantity),0) -isnull(sum(pri.quantity),0) as qty 
    from tbl_product p 
    left join tbl_purchase_item pid on p.product_code=pid.product_code 
    left join tbl_purchase pu on pu.purchase_code=pid.purchase_code 
    left join tbl_tax t on t.tax_code=p.tax_code 
    left join tbl_sale_item si on si.product_code=p.product_code 
    left join tbl_sale s on s.sale_code=si.sale_code 
    left join tbl_sale_return sr on sr.sale_code=s.sale_code 
    left join tbl_sale_return_item sri on  sri.sale_return_code=sr.sale_return_code 
    left join tbl_purchase_return_item pri on pri.purchase_code=pu.purchase_code 
    group by p.product_code,p.product_name,pid.price,t.percentage,p.discount_type,p.discount_amount,p.profit_type,p.profit_amount,pu.purchase_code,pid.quantity 
) as abc 
where qty >0 
+0

がGROUP BYと組み合わせDISTINCT SELECTを検討? – jarlh

+1

疑問?フェッチの時間は何ですか?あなたは実行計画/出力を確認しましたか? – jarlh

+0

左結合が多すぎます。避けることができるDISTINCT節と、フィールドが多すぎるGROUP節です。これらの各テーブルのすべてのデータが本当に必要ですか?サブ問合せでは、qtyという名前の計算列をフェッチします。問合せの外側には、「WHERE qty = 0」を追加します。サブクエリにWHERE句を含めると、qtyが0の行がすべて削除されます。 質問を 'EXPLAIN '出力に更新してください。クエリの各セクションを使用してフェッチされた行の数が通知されます。 –

答えて

3

データベースの見た目がわかりません。ジョインが多すぎると、それが遅いの根源だと思います。

まず、結合で使用されているすべての列にインデックスを付ける必要があります。

それでも解決しない場合は、Denormalizationを実行してください。そうすれば、データベースに冗長性が導入されますが、読み込み時間が改善されます。

0
  1. 大きなテーブル
  2. と小さめのテーブルに参加し、テーブル上のインデックス
関連する問題