У меня есть две таблицы, которые выглядят так:
table_1:
-----------------------------------
| ID | customer_id | city |
-----------------------------------
| 0 | E100 | Sydney |
-----------------------------------
| 1 | E200 | Toronto |
-----------------------------------
| 2 | E300 | New York |
-----------------------------------
table_2:
----------------------------------------------
| customer_id | timestamp | receipt |
----------------------------------------------
| E200 | '2019-03-25' | 200$ |
----------------------------------------------
| E300 | '2019-03-26' | 300$ |
----------------------------------------------
| E300 | '2019-03-26' | 100$ |
----------------------------------------------
| E100 | '2019-03-27' | 50$ |
----------------------------------------------
| E100 | '2019-03-28' | 50$ |
----------------------------------------------
| E100 | '2019-03-29' | 50$ |
----------------------------------------------
Я хочу подвести итогвсе квитанции для каждого отдельного customer_id. Таблица результатов должна выглядеть следующим образом:
----------------------------------------------
| customer_id | city | sum(receipt) |
----------------------------------------------
| E100 | Sydney | 150$ |
----------------------------------------------
| E200 | Toronto | 200$ |
----------------------------------------------
| E300 | New York | 400$ |
----------------------------------------------
Для этого я использую следующий запрос PostgreSQL:
SELECT a.customer_id, a.city, SUM(b.receipt)
FROM public.table_1 a
INNER JOIN public.table_2 b
ON a.customer_id = b.customer_id
WHERE b.timestamp > '2019-03-25 00:00:00'
AND b.timestamp < '2019-04-01 00:00:00'
GROUP BY a.customer_id, a.city
Однако, поскольку таблица_2 имеет более 300 миллионов строк иТаблица_1 содержит 129 строк, запрос занимает слишком много времени (я не знаю, сколько именно времени -> EXPLAIN ANALYZE для этого запроса также не завершается). Я думаю, что ВНУТРЕННЕЕ СОЕДИНЕНИЕ - это горлышко бутылки (пожалуйста, поправьте меня, если я ошибаюсь)? Но я знаю, что запрос работает правильно, поскольку я пробовал его с фильтрацией всего один день (а не одну неделю).
У меня вопрос, как ускорить этот запрос. Я уже рассмотрел вопрос о добавлении индекса, подобного этому:
CREATE INDEX table_2_index ON table_2(customer_id, timestamp)
Но этот запрос также занимает вечность.
Есть предложения?