【问题标题】:Postgresql EXPLAIN commandPostgresql 解释命令
【发布时间】:2020-12-10 09:36:29
【问题描述】:

我的查询在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))

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

【问题讨论】:

  • edit您的问题并添加使用explain (analyze, buffers, format text)生成的完整执行计划(不是只是一个“简单”解释)

标签: postgresql explain


【解决方案1】:

Postgresql 有一个聪明的引擎,它试图规划运行查询的最佳方式。通常,这涉及尽可能少地从磁盘读取,因为磁盘操作很慢。索引之所以如此有用的原因之一是,通过从索引中读取,我们可以在表中找到少量需要读取的行以满足查询,从而避免读取整个表.但是请注意,索引也在磁盘上,因此读取索引也需要一些时间。

现在,假设您的查询有两个过滤器,一个在 A 列上,一个在 B 列上,两者都已编入索引。根据 postgresql 收集的统计信息,大约有 5 行满足 A 列上的过滤器,大约 1000 行满足 B 列上的过滤器。在这种情况下,只读取 A 列上的索引是有意义的,那么读取所有匹配的 5 行(左右),并过滤掉任何与 B 列上的过滤器不匹配的行。读取 B 列上的索引可能比仅读取 5 行更昂贵!

实际原因可能与我的示例不同,但关键是 postgresql 只是试图尽可能高效。

【讨论】:

  • 这是正确的答案 - 观察 14 行的估计值。
猜你喜欢
  • 2013-08-26
  • 1970-01-01
  • 2014-10-25
  • 2019-10-27
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多