所以我有一个包含大约80 000张发票的数据库,每张发票都有一张表中列出的发票项目,其中包含价格,增值税和折扣以及发票ID。我还有一张收据表,其中包含已支付的价格和发票ID。
我需要找出哪些发票没有全部付清。 到目前为止我所拥有的是:
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分钟才能执行。
我需要的是一张桌子,其中包含所有已开票的价格和支付的价格,每张发票一行。我需要它比3分钟跑得快。
编辑:所以,如果我按部分删除该组,它突然只需要0.17秒,但只给我一行。有什么我可以做而不是得到相同的结果?
答案 0 :(得分:0)
很难检查这个,但尝试用
替换whereFROM invoices_items ii
join invoices inv on ii.invoice_id = inv.id
WHERE inv.invoicing_date < 1493503200
使用带有子选择的where in
会导致性能问题,在这种情况下,简单连接应该生成相同的值。
编辑: 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;