【发布时间】:2020-12-22 08:11:28
【问题描述】:
我使用 PostgreSQL,并且我有一个名为 table 的表。
此表包含一个名为 created_at 的列(data_type 是 timestamptz),它使用 BTREE 进行索引。
我想计算一段时间内按created_at::date 分组的行数(按from_date 和end_date 过滤)。
我运行以下查询(结果符合预期):
SELECT ("table"."created_at" AT TIME ZONE 'UTC')::date AS "date",
COUNT("table"."id") AS "count"
FROM "table"
WHERE ("table"."created_at" >= '2018-08-05T00:00:00+00:00'::timestamptz AND "table"."created_at" <= '2020-09-05T00:00:00+00:00'::timestamptz)
GROUP BY ("table"."created_at" AT TIME ZONE 'UTC')::date
ORDER BY "date" ASC
此查询需要很长时间才能运行(超过 200 万行),在查看查询计划时,我注意到有大量 Seq Scan:
GroupAggregate (cost=538741.06..605206.42 rows=2954016 width=12) (actual time=3866.460..5077.054 rows=559 loops=1)
Group Key: ((timezone('UTC'::text, created_at))::date)
-> Sort (cost=538741.06..546126.10 rows=2954016 width=8) (actual time=3866.414..4413.922 rows=2954016 loops=1)
Sort Key: ((timezone('UTC'::text, created_at))::date)
Sort Method: external merge Disk: 52056kB
-> Seq Scan on table (cost=0.00..140489.32 rows=2954016 width=8) (actual time=0.070..2194.108 rows=2954016 loops=1)
Filter: ((created_at >= '2018-08-05 00:00:00+00'::timestamp with time zone) AND (created_at <= '2020-09-05 00:00:00+00'::timestamp with time zone))
Planning time: 1.018 ms
Execution time: 5094.280 ms
我想了解以下内容:
- 查询中应该改进的地方(如果有的话)
- 表结构有哪些需要改进的地方(如果有的话)
- 使用的索引类型 (BTREE) 是否适合此类查询?
【问题讨论】:
标签: sql postgresql query-performance