PostgreSQL的EXPLAIN命令

3

我有一个查询,在WHERE子句之后有几个filter条件。

此外,大多数涉及的列都有索引。

当我运行EXPLAIN命令时,我看到:

->  Bitmap Index Scan on feature_expr_idx  (cost=0.00..8.10 rows=14 width=0)

feature_expr_idxWHERE 子句中一个列的索引。

但是其他列的索引未显示。相反,它们会显示在 FILTER 行中:

  Filter: ((NOT is_deleted) AND (vehicle_type = 'car'::text) AND (source_type = 'NONE'::text))

为什么结果只显示一个索引,而其他具有索引的列却是过滤器的一部分?


请**[编辑]您的问题,并添加使用explain(analyze,buffers,format text)**生成的完整执行计划(不仅仅是“简单”的解释)。 - user330315
1个回答

2
PostgreSQL拥有一个聪明的引擎,试图规划运行查询的最佳方式。通常,这涉及尽可能少地从磁盘读取数据,因为磁盘操作很慢。索引如此有用的原因之一是,通过从索引中读取数据,我们可以找到表中仅需读取少量行以满足查询的行数,从而避免了读取整个表格。但请注意,索引也存在于磁盘上,因此读取索引也需要一些时间。
现在,想象一下您的查询有两个过滤器,一个在A列上,一个在B列上,两者都有索引。根据PostgreSQL收集的统计数据,大约有5行符合A列的过滤条件,大约有1000行符合B列的过滤条件。在这种情况下,只读取A列上的索引,然后读取所有匹配的5行(左右),并过滤掉不符合B列过滤条件的行,这样做比读取B列上的索引更加高效。
实际原因可能与我的例子不同,但重点是PostgreSQL只是试图尽可能高效。

1
那是正确的答案 - 观察14行的估计。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接