如何解决Postgres:添加哪个索引
我有一个主要用于此查询的表(这里只使用了 3 列,meter
、timeStamputc
和 createdOnUtc
,但表中还有其他列),它开始花太长时间:
select
rank() over (order by mr.meter,mr."timeStamputc") as row_name,max(mr."createdOnUtc") over (partition by mr.meter,mr."timeStamputc") as "createdOnUtc"
from
"MeterReading" mr
where
"createdOnUtc" >= '2021-01-01'
order by row_name
;
(这是显示我的问题的最小查询。它本身可能没有太大意义,或者可以重写)
我想知道使用哪种索引(或其他技术)来优化此特定查询。
createdOnUtc
上的基本索引已经有所帮助。
我主要想知道这两个窗口功能。它们非常相似,所以我将它们分解(命名窗口具有相同的 partition by
和 order by
),它没有效果。在 meter,"timeStamputc"
上添加索引也没有效果(查询计划不变)。
有没有办法在窗口函数内的那两列上使用索引?
编辑 - 解释分析输出:使用 createdOnUtc 索引
Sort (cost=8.51..8.51 rows=1 width=40) (actual time=61.045..62.222 rows=26954 loops=1)
Sort Key: (rank() OVER (?))
Sort Method: quicksort Memory: 2874kB
-> WindowAgg (cost=8.46..8.50 rows=1 width=40) (actual time=18.373..57.892 rows=26954 loops=1)
-> WindowAgg (cost=8.46..8.48 rows=1 width=40) (actual time=18.363..32.444 rows=26954 loops=1)
-> Sort (cost=8.46..8.46 rows=1 width=32) (actual time=18.353..19.663 rows=26954 loops=1)
Sort Key: meter,"timeStamputc"
Sort Method: quicksort Memory: 2874kB
-> Index Scan using "MeterReading_createdOnUtc_idx" on "MeterReading" mr (cost=0.43..8.45 rows=1 width=32) (actual time=0.068..8.059 rows=26954 loops=1)
Index Cond: ("createdOnUtc" >= '2021-01-01 00:00:00'::timestamp without time zone)
Planning Time: 0.082 ms
Execution Time: 63.698 ms
解决方法
有没有办法在窗口函数内的那两列上使用索引?
没错;窗口函数不能使用索引,因为工作只否则将是最终结果,所有数据选择已经完成。来自documentation。
窗口函数考虑的行是那些“虚拟 表”由查询的 FROM 子句生成,并由其 WHERE 过滤, GROUP BY 和 HAVING 子句(如果有)。例如,删除了一行 因为它不满足 WHERE 条件不被任何窗口看到 功能。一个查询可以包含多个分割的窗口函数 使用不同的 OVER 子句以不同的方式处理数据,但它们都 对该虚拟表定义的相同行集合进行操作。
索引的目的是加快“虚拟表”的创建。应用索引只会减慢速度:数据已经在内存中。扫描它的速度比任何索引都要快几个数量级。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。