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

Postgres 没有使用部分索引

如何解决Postgres 没有使用部分索引

我尝试使用部分索引计算表中的 id,但性能非常低

SELECT COUNT("refuel_request"."refuel_request_id") as "count" 
FROM "refuel_request" 
WHERE "refuel_request"."refuel_request_status_id" 
IN ('1','2','3')

我创建索引

CREATE INDEX idx_refuel_request_status_id10 ON refuel_request (refuel_request_status_id)
WHERE "refuel_request"."refuel_request_status_id" 
IN ('1','3')

你能解释一下我做错了什么吗?

解释

[
 {
"Plan": {
  "Node Type": "Seq Scan","Parallel Aware": false,"Relation Name": "refuel_request","Alias": "refuel_request","Startup Cost": 0,"Total Cost": 160442.88,"Plan Rows": 4700100,"Plan Width": 16,"Filter": "(refuel_request_status_id = ANY ('{1,2,3}'))"
   }
  }
 ]

解释(分析,缓冲区)

EXPLAIN (ANALYZE,BUFFERS)

解释(分析,格式化文本)

Finalize Aggregate  (cost=114931.68..114931.69 rows=1 width=8) (actual time=570.019..570.020 rows=1 loops=1)
  ->  Gather  (cost=114931.47..114931.68 rows=2 width=8) (actual time=569.735..575.504 rows=3 loops=1)
        Workers Planned: 2
        Workers Launched: 2
        ->  Partial Aggregate  (cost=113931.47..113931.48 rows=1 idth=8) (actual time=528.094..528.094 rows=1 loops=3)
              ->  Parallel Seq Scan on refuel_request cost=0.00..109035.53 rows=1958375 width=16) (actual time=0.070..452.908 rows=1566700 loops=3)
                    Filter: (refuel_request_status_id = ANY ('{1,3}'))
Planning Time: 0.665 ms
Execution Time: 575.538 ms

解决方法

过滤器在顺序扫描中没有删除任何行,因此表中的所有行似乎都有 refuel_request_status_id 等于 '1''2''3'。所以索引中的 WHERE 条件没有区别。

您可以尝试使用 enable_seqscan = off 来查看 PostgreSQL 是否做出了正确的选择。如果不是,则可能是 random_page_cost 没有为您的硬件正确设置。

如果事实证明顺序扫描确实是最快的方式,那么您无能为力来加速查询:您可以获得更快的存储空间或更多的 RAM 来缓存表。

Counting is slow business.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?