sql - PostgreSQL:使用 join 和 group by 查询花费的时间太长

标签 sql postgresql performance join indexing

我有两个表,如下所示:

表_1:

-----------------------------------
| ID  |  customer_id  |   city    |
-----------------------------------
| 0   |  E100         |  Sydney   |
-----------------------------------
| 1   |  E200         |  Toronto  | 
-----------------------------------
| 2   |  E300         |  New York |
-----------------------------------

表_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

但是,由于table_2有超过300mio行,table_1有129行, 查询花费的时间太长(我不知道究竟有多长 -> EXPLAIN ANALYZE 对此查询也没有完成)。我猜 INNER JOIN 是这里的瓶颈(如果我错了请纠正我)? 但我确实知道查询在做正确的事情,因为我已经尝试过仅过滤一天(而不是一周)。

我的问题是如何加速这个查询。我已经考虑过添加这样的索引:

CREATE INDEX table_2_index ON table_2(customer_id, timestamp)

但是这个查询也需要很长时间。

有什么建议吗?

最佳答案

尝试先聚合,再加入:

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

关于sql - PostgreSQL:使用 join 和 group by 查询花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58197142/

相关文章:

python - OFFSET 不能为负

SQL - 如果值存在则按列排序,否则按第二列排序

python - 为什么这种测试回文的方法比使用 [::-1] 慢得多?

mysql - 在新列中获取以前的列值

postgresql - => 和 -> 有什么区别?

php - Propel ORM - 连接不相关的表

c++ - 是什么让这个桶排序函数变慢了?

c++ - 传递大物体的最快方法

php - 更新比较 4 个变量的表?

mysql - 两个左连接 - 重复计数