微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

此查询是否在 Psql 中使用按阶段分组的索引?

如何解决此查询是否在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?