PostgreSQL 需要 VACUUM 或 ANALYZE 计划来使用索引吗?

Posted

技术标签:

【中文标题】PostgreSQL 需要 VACUUM 或 ANALYZE 计划来使用索引吗?【英文标题】:PostgreSQL need VACUUM or ANALYZE schedule to make use of indexes? 【发布时间】:2013-09-19 07:40:26 【问题描述】:

我正在为现有 PostgreSQL 数据库实例中的表创建索引。我知道EXPLAIN ANALYZE 后跟应用程序的 SQL 命令是了解我的索引是否被使用的最简单方法。

例如:

EXPLAIN ANALYZE SELECT A,B,C FROM MY_TABLE WHERE C=123;

会还给我的:

Seq Scan on public.my_table (cost=...)

而且,在创建索引后,它会返回:

Index Scan using my_index_name on public.my_table (cost=...)

在我的优化任务中,我发现了一个比较大的表,它偶尔会遇到性能问题,并为此创建了一个索引。这是将顺序扫描转换为上述索引扫描的完美示例。它奏效了。

但是,在创建索引之后,第二个在列表中排名最慢的查询,仍然不到 0.5 秒,即索引没有任何区别!创建索引后,它仍然会执行Seq Scan。该表虽然有几百条记录,但每年可能会增长几千条。

在 PostgreSQL 文档中深入挖掘,它说当使用上述索引没有显着提高性能时,它仍然会使用顺序扫描。

然后是可怕的部分:建议您运行 ANALYZE 或打开“Autovacuum”守护程序。这样,数据库将知道表的大小并正确地决定查询计划。

我知道使用索引是相当基本的,所以这在生产环境中是绝对必要的吗?换句话说,PostgreSQL 会在需要使用索引时使用它而不需要分析还是将吸尘器作为一项额外的任务?

【问题讨论】:

答案是:是的。在只有几百行的表上,表扫描比索引扫描更快(尤其是在返回大部分行时)并不罕见。除非您有一些非常不均匀的数据分布,否则优化器将在大多数情况下选择最佳计划。另请参阅我的答案:***.com/a/5203827/330315 如果您(绝对)确定查询会从索引中受益,但规划者没有选择它,那么请发布 that 查询including all relevant information 感谢您的评论。该查询对数字列有一个简单的等式过滤器,并且没有连接,如上面的示例。我通常在数据库中保持简单。但是将“解释计划”索引恐慌与其他数据库进行比较会很有趣,我确实必须检查几次列名是否正确!默认情况下似乎启用了统计信息收集,所以我想这个问题在现实中并没有那么重要。 是的,自动真空和统计收集的默认设置应该足够好开始了。再次重申:如果您对特定查询有疑问,请发布(可能作为新问题) 【参考方案1】:

简短回答“只需运行 autovacuum。”长答案...是的,因为统计数据可能会过时。

让我们谈谈索引以及 PostgreSQL 如何/何时决定使用它们。

PostgreSQL 获取一个查询,解析它,然后开始计划过程。我们将如何扫描表?我们将如何加入他们以及以什么顺序?这些不是微不足道的决定,试图找到通常最好的做事方式通常意味着 PostgreSQL 需要了解有关表的一些信息。

首先要注意的是,索引并不总是胜利。没有任何计划能胜过单页表的顺序扫描,即使是 5 页表,顺序扫描也几乎总是比索引扫描快。所以 PostgreSQL 不能安全地决定“使用所有可用的索引”。

所以 PostgreSQL 决定是否使用索引的方式是检查统计信息。现在,这些已经过时了,这就是您希望 autovacuum 更新它们的原因。你说你的表有几百条记录,而静态数据可能已经过时了。如果 PostgreSQL 不能说索引是一个胜利,它就不会使用它。数百条记录将接近“索引可能有帮助”的领域,具体取决于索引在清除记录方面的选择性。

在您的大表中,根据现有统计数据,索引可能没有任何帮助。在您较小的表格中,可能有一个问题,它会根据其拥有的统计信息以一种方式得到回答,而根据较新的统计信息以另一种方式回答。

【讨论】:

感谢您的回答。当我阅读文档时,确实看起来“吸尘”是一个额外的东西,但事实证明这是默认行为。干杯 这是我认为在 8.3 iirc 中的默认行为。有时在 8.x 中。在此之前必须对其进行配置,在此之前必须手动运行。

以上是关于PostgreSQL 需要 VACUUM 或 ANALYZE 计划来使用索引吗?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql小技巧

postgresql vacuum操作

postgresql vacuum操作

PostgreSQL的vacuum流程

postgresql vacuum table

也谈PostgreSQL的Vacuum机制及其最佳实践