繁体   English   中英

我的Postgres数据库没有使用我的索引; 我解决了,但不了解解决方法,有人可以解释发生了什么吗?

[英]My Postgres database wasn't using my index; I resolved it, but don't understand the fix, can anyone explain what happened?

我在相关部分的数据库架构有一个名为User的表,该表具有一个布尔字段Admin。 在“管理员”字段上有一个索引。

前一天,我将完整的生产数据库还原到开发计算机上,然后仅对数据库进行了很小的更改,因此它们应该非常相似。

在开发计算机上运行以下命令时,得到了预期的结果:

EXPLAIN SELECT * FROM user WHERE admin IS TRUE;

Index Scan using index_user_on_admin on user (cost=0.00..9.14 rows=165 width=3658)
Index Cond: (admin = true)
Filter: (admin IS TRUE)

但是,当我在生产机器上运行完全相同的命令时,我得到了:

Seq Scan on user  (cost=0.00..620794.93 rows=4966489 width=3871)
Filter: (admin IS TRUE)

因此,它没有使用与查询完全匹配的精确索引,而是使用了将近500万行的顺序扫描!

然后,我尝试运行EXPLAIN ANALYZE SELECT * FROM user WHERE admin IS TRUE; 希望ANALYZE可以使Postgres意识到对500万行进行顺序扫描不如使用索引好,但是并没有改变任何东西。

我还尝试运行REINDEX INDEX index_user_on_admin ,以防索引损坏,没有任何好处。

最后,我给VACUUM ANALYZE user打电话,那很快就解决了这个问题。

我对真空的主要理解是,它用于回收浪费的空间。 可能会发生什么,导致我的索引异常严重,为什么要对其进行真空修复?

  1. ANALYZE最有可能通过更新计划者使用的数据统计信息来确定哪种方法是运行查询的最佳方式。 VACUUM ANALYZE只是按顺序运行两个命令,首先是VACUUM ,然后是ANALYZE ,但是ANALYZE本身可能足以提供帮助。

  2. EXPLAINANALYZE选项与ANALYZE命令完全无关。 它只会导致Postgres运行查询并报告实际的运行时间,以便可以将它们与计划者的预测进行比较(不带ANALYZE EXPLAIN仅显示查询计划以及计划者认为将要花费的费用,但实际上并未运行查询)。 因此EXPLAIN ANALYZE没有帮助,因为它没有更新统计信息。 ANALYZEEXPLAIN ANALYZE是两个完全不同的动作,只是碰巧使用了相同的单词。

PostgreSQL保留了许多有关表条件,索引条件,数据等的高级统计信息。有时这可能会不同步。 运行VACUUM将解决此问题。

在开发中从头开始重新加载表时,它可能具有相同的效果。

看看这个:

http://www.postgresql.org/docs/current/static/maintenance.html#VACUUM-FOR-STATISTICS

部分索引似乎是解决您的问题的好方法:

CREATE INDEX admin_users_ix ON users (admin)
    WHERE admin IS TRUE;;

没有意义在相同的字段上索引很多元组。

我认为这是最可能的解释。

仅当返回很少的行时,您的索引才有用(顺便说一句,由于这个原因,我不喜欢为布尔值建立索引-您可能会考虑使用部分索引,甚至添加where admin为true,因为那样会仅在可能仍然可用的情况下保留索引)。

如果要检索表中10%以上的iirc页面,那么计划者可能会选择大量的顺序磁盘I / O,而不是少量的随机磁盘I / O,因为那样您就不会不必等待盘子转动。 查找速度是那里的一个大问题,PostgreSQL将倾向于尝试将其与从关系中检索到的实际数据量进行平衡。

您收集到的统计信息表明该表比实际小,或者作为一部分用户的管理员比您多,因此计划者使用错误的信息来做出决定。

VACUUM ANALYZE做三件事。 首先,它冻结所有事务可见的元组,因此事务回绕不是问题。 然后,它将没有事务可见的元组分配为可用空间。 这些都不影响您的问题。 但是,第三点是分析表并收集表的统计信息。 请记住,这是随机抽样,因此有时可能会关闭。 我的猜测是,上一次运行时,该页面吸引了许多管理员,因此严重高估了系统的管理员数量。

这可能是重新检查自动真空设置的好时机,因为在其他地方统计数据也很可能已经过时,但这还不确定。 特别是,基于成本的真空设置有时会默认使用默认设置,以使真空永远无法完全赶上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM