2017-05-24 6 views
-2

私は約80,000の請求書を持つデータベースを持っています。それぞれのテーブルには価格とVATと割引と請求書IDを持つ請求書項目があります。私はまた、支払われた価格と請求書IDの領収書テーブルを持っています。未払いの請求書検索のためにMySQLのクエリが遅すぎる

どの請求書が合計で支払われていないかを調べる必要があります。 私がこれまで持っていることはこれです:

SELECT SUM((i.price-(i.price*(i.discount/100)) + (i.price-(i.price*(i.discount/100))*(tax/100)))*i.quantity) invoiced 
    , invoice_id invoiceitems 
    , (SELECT SUM(payed_value) 
      FROM receipts 
      WHERE invoice_id = invoiceitems 
      AND payed_value IS NOT NULL 
     ) paid 
    FROM invoices_items i 
    WHERE invoice_id IN (SELECT id 
          FROM invoices x 
         WHERE x.invoicing_date < 1493503200 
         ) 
    GROUP 
     BY i.invoice_id 
    HAVING paid < invoiced; 

問題は、このクエリを実行するために3分かかります。

私が必要とするのは、すべての価格が請求され、価格が支払われ、請求書ごとに1行のテーブルが必要です。私はそれを3分よりもずっと速く走らせる必要がある。

編集:だから私はグループによって部分的に削除すると突然わずか0.17秒かかりますが、私には1行しか与えません。同じ結果を得るために私が代わりにできることは何ですか?

+1

の主要なリファクタリングは、あなたの質問を編集して、同じデータおよび望ましい結果を提供してください。 –

+0

@ GordonLinoff他に何が必要ですか?私はあなたが求めていることは質問にあると思っています –

+0

参照:[私は非常に単純なSQLクエリであると思われるMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952 /なぜ、私は提供するためのmcveのために私にとっては非常に単純なSQLクエリのように) – Strawberry

答えて

0

それはこれをチェックすることは困難だが、パフォーマンス上の問題を引き起こすことが知られており、この場合には単純結合同じ値を生成する必要がありさ副選択で

where inを使用して
FROM invoices_items ii 
    join invoices inv on ii.invoice_id = inv.id 
    WHERE inv.invoicing_date < 1493503200 

でどこを交換してみてください。

編集: SQL かもしれ仕事

SELECT SUM((i.price-(i.price*(i.discount/100)) + (i.price-(i.price*(i.discount/100))*(tax/100)))*i.quantity) invoiced 
    , invoice_id 
    , SUM(coalesce(p.payed_value,0)) paid 
    FROM invoices_items i 
     join invoices inv on i.invoice_id = inv.id 
     left join receipts rec on rec.invoice_id = i.invoice_id 
    WHERE inv.invoicing_date < 1493503200 
    GROUP 
     BY i.invoice_id 
    HAVING paid < invoiced; 
+0

3分以上お待ちください –

+0

私は新しい選択肢を追加しました。これを試すことができますか? –

関連する問題