Как сделать запрос быстрее - PullRequest
0 голосов
/ 06 мая 2020

Вот мой код:

SELECT m.id, (SELECT count(r.id) 
              FROM reports as r 
              WHERE r.date BETWEEN NOW()-INTERVAL '7 days' AND NOW() 
                and r.decision = 'ACCEPTED' 
                and r.customer_id in (SELECT c.id 
                                      FROM customers as c 
                                      WHERE c.manager_id = m.id)) as count 
FROM managers as m;

Где в таблицах - менеджеры, клиенты и отчеты. Я хочу ВЫБРАТЬ для каждого менеджера количество отчетов, которые сделали все его клиенты (с выбранными свойствами). Проблема с этим кодом в том, что он занимает слишком много времени и почему-то не может найти лучшего способа построения этого запроса. Есть идеи?

1 Ответ

1 голос
/ 06 мая 2020

Я думаю, стандартное внутреннее соединение между этими тремя таблицами с индексами, определенными для столбцов reports.date, reports.customer_id и customers.manager_id, как указано в комментарии (, кроме того, учитывая столбцы managers.id и customer.id как предполагается, что это первичные ключи, на которых уже есть уникальные индексы ) будет достаточно с точки зрения производительности:

SELECT m.id, count(r.id)
  FROM customers c
  JOIN managers m ON r.customer_id = c.id
  JOIN reports r ON  m.id = c.manager_id
 WHERE r.date BETWEEN NOW() - INTERVAL '7 days' AND NOW()
   AND r.decision = 'ACCEPTED'
 GROUP BY m.id
...