Я хотел бы знать, какой запрос (и индекс) будет лучшим для этого. Я пользуюсь Symfony. Но для этого запроса я использовал обычный SQL. Я сделал таблицы с doctrine.
Я хотел бы иметь актив каждого клиента.
У меня около
Таблицы:
Client ~ 20 000 rows -> Index : foreign key,id, reference, (reference, id),
Invoice ~ 690 000 rows -> Index : foreign key,id, reference,(client_id, id),
Invoice_line ~ 4 000 000 rows -> Index : foreign key, qty, price, reference,(invoice_id, quantity, unit_price) ,
credit_note ~ 40 000 rows -> Index : foreign key,id, reference,
credit_note_line ~ 61 000 rows -> Index : foreign key, id, qty, price, reference,
Product ~ 75 000 rows -> Index : foreign key, id, reference,
строка представляет один продукт с указанием цены и количества
Актив для одного клиента = Всего счетов клиента - Всего кредитных нот клиента
каждый счет (и кредит-нота) имеют 1 или X invoice_lines, которые представляют один продукт с количествами и ценой. Пример:
Итак, я сделал этот запрос:
SELECT
a1.reference,
a1.id,
SUM(a1.balance) AS "asset"
FROM
(
SELECT
c2.reference,
c2.id,
SUM(il.quantity * il.unit_price) AS "balance"
FROM CLIENT AS
c2
INNER JOIN invoice AS i
ON
i.client_id = c2.id
INNER JOIN invoice_line AS il
ON
i.id = il.invoice_id
GROUP BY
c2.reference
UNION ALL
SELECT
c1.reference,
c1.id,
- SUM(cnl.quantity * cnl.unit_price) AS "balance"
FROM CLIENT AS
c1
INNER JOIN credit_note AS cn
ON
cn.client_id = c1.id
INNER JOIN credit_note_line AS cnl
ON
cn.id = cnl.credit_note_id
GROUP BY
c1.reference
) AS a1
GROUP BY
reference
ORDER BY
`asset`
DESC
Это дает мне правильный ответ, но это очень долго (15 с). Как я могу сократить время запроса (например, 2 с)?
Я также хотел бы получить актив для N-1, поэтому мне нужно выполнить этот запрос дважды, и это займет много раз.
Большое спасибо за вашу помощь и ваше время!