如何解决此查询是否在 Psql 中使用按阶段分组的索引?
我在 Postgresql 中的表包含 1.2m 行。我在 timestamp1,id13 上使用组合索引 我的查询如下所示:
EXPLAIN (ANALYZE,VERBOSE,COSTS,BUFFERS ) select date_trunc('day',timestamp1) as day,avg(id9) from oneindextwocolumns where timestamp1>='2019-01-01 00:00:00' and timestamp1<='2020-12-31 00:55:00' group by day,id13 order by day desc
解释计划是这样的:
"GroupAggregate (cost=40802.98..46082.38 rows=211176 width=24) (actual time=150.115..213.289 rows=91645 loops=1)"
" Output: (date_trunc('day'::text,timestamp1)),avg(id9),id13"
" Group Key: (date_trunc('day'::text,oneindextwocolumns.timestamp1)),oneindextwocolumns.id13"
" Buffers: shared hit=5937,temp read=875 written=877"
" -> Sort (cost=40802.98..41330.92 rows=211176 width=24) (actual time=150.088..169.306 rows=210252 loops=1)"
" Output: (date_trunc('day'::text,id13,id9"
" Sort Key: (date_trunc('day'::text,oneindextwocolumns.timestamp1)) DESC,oneindextwocolumns.id13"
" Sort Method: external merge disk: 7000kB"
" Buffers: shared hit=5937,temp read=875 written=877"
" -> Index Scan using oneindextwocolumns_timestamp1_id13_idx on public.oneindextwocolumns (cost=0.43..22126.48 rows=211176 width=24) (actual time=0.020..67.899 rows=210252 loops=1)"
" Output: date_trunc('day'::text,timestamp1),id9"
" Index Cond: ((oneindextwocolumns.timestamp1 >= '2019-01-01 00:00:00'::timestamp without time zone) AND (oneindextwocolumns.timestamp1 <= '2020-12-31 00:55:00'::timestamp without time zone))"
" Buffers: shared hit=5937"
"Planning Time: 0.118 ms"
"Execution Time: 217.945 ms"
我如何知道小组赛阶段是否使用索引? 提前致谢!
解决方法
它不使用索引来提供顺序。如果是,那么在聚合之前发生的排序的功能是什么?如果它使用索引提供的顺序进行分组,那么计划将显示由 IndexScan 直接提供的 GroupAgg,中间没有 Sort。
对此有一个警告。在最新版本的 PostgreSQL 中,还有一个增量排序。在这种情况下,索引(或其他东西)以特定顺序提供行,这主要是我们需要的,但是我们需要重新排序关系以将它们按特定顺序排列。例如,如果索引提供按 (col1)
排序,但我们需要按 (col1,col2)
排序,则可以使用此方法。但这里的情况并非如此——您的情况不符合这种排序条件,如果使用排序节点,排序节点将被标记为“增量排序”,而不仅仅是“排序”。
规划器没有考虑到按时间戳 1 排序也必然按 date_trunc('day'::text,timestamp1)
排序这一事实。这是一个缺失的优化。也许有一天有人会实施它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。