PostgreSQL: запрос с объединением и группировкой занимает слишком много времени - PullRequest
0 голосов
/ 02 октября 2019

У меня есть две таблицы, которые выглядят так:

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)

Но этот запрос также занимает вечность.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Попробуйте сначала объединиться, затем присоединитесь:

SELECT a.customer_id, a.city, b.receipt_sum
FROM public.table_1 a 
 JOIN (
   SELECT t2.customer_id, sum(t2.receipt) as receipt_sum
   FROM public.table_2 t2
   WHERE t2.timestamp > '2019-03-25 00:00:00' 
     AND t2.timestamp < '2019-04-01 00:00:00' 
   GROUP BY t2.customer_id
 ) b ON a.customer_id = b.customer_id
1 голос
/ 02 октября 2019

давайте попробуем сначала отфильтровать таблицу table_2 перед присоединением.

SELECT a.customer_id, a.city, SUM(b.receipt) 
FROM public.table_1 a
INNER JOIN 
(SELECT receipt, customer_id FROM public.table_2 
    WHERE timestamp > '2019-03-25 00:00:00' 
    AND timestamp < '2019-04-01 00:00:00') b ON a.customer_id = b.customer_id
GROUP BY a.customer_id, a.city
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...