首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql EXPLAIN命令

Postgresql EXPLAIN命令
EN

Stack Overflow用户
提问于 2020-08-21 09:52:29
回答 1查看 70关注 0票数 3

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

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

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

代码语言:javascript
复制
->  Bitmap Index Scan on feature_expr_idx  (cost=0.00..8.10 rows=14 width=0)

feature_expr_idxWHERE子句中某一列的索引。

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

代码语言:javascript
复制
  Filter: ((NOT is_deleted) AND (vehicle_type = 'car'::text) AND (source_type = 'NONE'::text))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-21 13:17:27

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

现在,假设您的查询有两个过滤器,一个在列A上,另一个在列B上,这两个过滤器都建立了索引。根据postgresql收集的统计数据,大约有5行满足A列的筛选器,大约1000行满足B列的筛选器。在这种情况下,只读取A列的索引,然后读取所有匹配的5(或更多)行,并过滤出与B列的筛选器不匹配的任何行。读取B列的索引可能比只读取5行的成本更高!

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63515408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档