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

Postgres:添加哪个索引

如何解决Postgres:添加哪个索引

我有一个主要用于此查询的表(这里只使用了 3 列,metertimeStamputccreatedOnUtc,但表中还有其他列),它开始花太长时间:

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 byorder 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 举报,一经查实,本站将立刻删除。

相关推荐


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”。这是什么意思?